这是一个插图类:
class TypeChecker<T> {
boolean isGood(Object something) {
// won't compile
return (something instanceof T);
// maybe works, but oh so ugly!
try {
@SuppressWarnings("unchecked")
T tmp = ((T) something);
}catch(ClassCastException e) {
return false;
}
return true;
}
}
有没有好办法呢?
特殊目的与示例有点不同,但想法是相同的 - 检查类型T(参数)的变量是否可以容纳某个对象。
答案 0 :(得分:10)
class TypeChecker<T> {
private Class<T> ofType;
TypeChecker(Class<T> ofType) {
this.ofType = ofType;
}
boolean isGood(Object obj) {
return ofType.isInstance(obj);
}
}
或者只是使用Class
而不是围绕它创建一个包装器对象,如果您需要的只是isInstance
检查。
没有其他方法可以动态执行运行时类型检查。您必须使用Class
。
isInstance
与instanceof
具有相同的语义(除了翻转左侧和右侧)所以
"hello world" instanceof String
String.class.isInstance("hello world")
两者都是真的。
另外,你的作品可能还有作品。片段,没有不起作用。泛型被删除,因此未经检查的强制转换不会在运行时发生。这就是他们不受限制的原因。 ClassCastException永远不会抛出。使用异常来确定逻辑流是不好的开始。