Java中C#关键字'as'的等价物

时间:2009-06-23 18:12:04

标签: c# java casting

在Java中,如果演员表失败,是否可以尝试演员并返回null

9 个答案:

答案 0 :(得分:52)

public static <T> T as(Class<T> t, Object o) {
  return t.isInstance(o) ? t.cast(o) : null;
}

用法:

MyType a = as(MyType.class, new MyType());   
// 'a' is not null

MyType b = as(MyType.class, "");   
// b is null

答案 1 :(得分:29)

您可以使用instanceof关键字来确定是否可以正确投射。

return obj instanceof String?(String)obj: null;

当然它可以被泛化并成为函数,但我认为问题是Java必须实现的目的。

答案 2 :(得分:5)

您可以,但不能使用Java中的单个函数:

public B nullCast(Object a) {

  if (a instanceof B) {
     return (B) a;
  } else {
     return null;
  }
}

编辑:请注意,如果不添加目标类,则无法使B类成为通用(对于此示例)(这与instanceof无法使用泛型类型的事实有关):< / p>

public <V, T extends V> T cast(V obj, Class<T> cls) {
  if (cls.isInstance(obj)) {
    return cls.cast(obj);
  } else {
    return null;
  }
}

答案 3 :(得分:2)

MyType e = ( MyType ) orNull( object, MyType.class );
// if "object" is not an instanceof MyType, then e will be null.

...

public static Object orNull( Object o , Class type ) { 
    return type.isIntance( o ) ? o : null;
}

我想这也可能以某种方式完成了泛型,但我认为但可能不是所需要的。

这个简单的方法接收Object并返回Object,因为强制转换是在方法客户端中执行的。

答案 4 :(得分:0)

AFAIK,这将是(一)这样做的方法:

SomeClassToCastTo object = null;
try {
  SomeClassToCastTo object = SomeClassToCastTo.class.cast(anotherObject);
}
catch (ClassCastException e) {
  object = null;
}

丑陋,但它应该做你想要的......

答案 5 :(得分:0)

在Java中,如果转换失败,您将获得ClassCastException。您可以捕获异常并将目标对象设置为null。

答案 6 :(得分:0)

您可以捕获异常:

Foo f = null;
try {
  f = Foo(bar);
}
catch (ClassCastException e) {}

或检查类型:

Foo f = null;
if (bar instanceof Foo)
  f = (Foo)bar;

答案 7 :(得分:0)

上述两种解决方案有些尴尬:

转换和捕获ClassCastException:创建异常对象可能很昂贵(例如计算堆栈跟踪)。

前面描述的nullCast方法意味着您需要为要执行的每个转换生成一个强制转换方法。

泛型因“类型擦除”而失败了......

您可以创建一个静态辅助方法,保证返回目标类的实例或null,然后转换结果而不用担心异常:

public static Object nullCast(Object source, Class target) {
    if (target.isAssignableFrom(source.getClass())) {
        return target.cast(source);
    } else {
        return null;
    }
}

示例电话:

Foo fooInstance = (Foo) nullCast(barInstance, Foo.class);

答案 8 :(得分:-1)

你可以处理这个捕捉ClassCastException