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

sho*_*osh 28 c# java casting

在Java中,null如果转换失败,是否可以尝试强制转换并返回?

eri*_*son 53

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

用法:

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

MyType b = as(MyType.class, "");   
// b is null
Run Code Online (Sandbox Code Playgroud)

  • 好的设计,但在这种情况下使用`isAssignableFrom`不是更好. (2认同)

Eug*_*kov 29

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

return obj instanceof String?(String)obj: null;
Run Code Online (Sandbox Code Playgroud)

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


Kat*_*one 5

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

public B nullCast(Object a) {

  if (a instanceof B) {
     return (B) a;
  } else {
     return null;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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