Java中是否有类似于C#中'AS'关键字的关键字?

25

众所周知,C#提供了AS关键字,它会自动执行一个检查操作,以确定对象是否是某个类型。如果是,就将其强制转换为需要的类型,否则返回null。

public class User { }
Object obj = someObj;
User user = obj As User;

在上面的例子中,一个对象obj可以是User类型或其他类型。用户将得到一个User类型的对象或null。这是因为C#的关键字As首先执行检查,如果可能,则将对象转换为结果类型。

那么在Java中是否有与C#的AS关键字等效的关键字?


虽然我觉得这是个好问题,但“as”模式真的太可怕了——我宁愿使用强制转换并获取异常(即可以修复的有噪音的故障),而不是将其静默转换为 null,在将来的某个随机点上可能会出问题......如果你真的不知道强制转换是否能工作,那么你仍然需要稍后测试是否为空,因此你甚至没有节省任何输入! - mikera
3
你仍然可以像Java一样进行转换。 "as"是开发人员有意选择的,表示“如果不是正确的类型,我不想要转换异常,我希望得到null”。 - Hounshell
3个回答

28
你可以创建一个帮助方法。
public static T as(Object o, Class<T> tClass) {
     return tClass.isInstance(o) ? (T) o : null;
}

User user = as(obj, User.class);

4
微小的更改 - 应该使用isInstance而不是isInstanceOf。 - Jeff Foster
谢谢Peter...我会尝试你的方法。 - Anubhav Ranjan

22

不可以,你可以使用instanceof进行检查,如果匹配则进行转换

User user = null;
if(obj instanceof User) {
  user = (User) obj;
}

我想你的意思是 x instanceof User,对吗? - templatetypedef
是的,已经修复以符合问题。 - jberg
3
使用 instanceof 就像使用 C# 中的 IS 关键字。 - Anubhav Ranjan
这个问题在类型正确的情况下可能会得到解决,但一旦出现不匹配,它就会抛出异常并终止程序。但是,在使用 As 关键字的情况下,我只需要检查值是否为空并继续执行即可。 - Anubhav Ranjan
@Anubhav - 如果你希望你的程序在未来能够维护,你是需要得到一个异常的。失败快速比风险让某人忘记他们的空值检查后,有一个流浪的空值在你的应用程序中传播要好得多...... - mikera
显示剩余4条评论

12

虽然没有关键词,但为了完整起见,我将给出与之等价的一行代码:

User user = obj instanceof User ? (User) obj : null;

(我不确定你是否需要显式地进行转换。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接