本文共 1101 字,大约阅读时间需要 3 分钟。
Eclipse表示,由于泛型橡皮擦,Type Parameter不允许使用instanceof操作.
我同意在运行时,不会保留类型信息.但请考虑以下类的通用声明:
class SomeClass{
T t;
SomeClass(Object o){
System.out.println(o instanceof T); // Illegal
}
}
在运行时,不会出现T!但是如果我实例化这个类型为Integer的类,那么相应的对象将具有Integer类型的字段t.
那么,为什么我不能用T检查变量的类型,它可以在运行时被Integer替换.而我实际上会做类似“o instanceof Integer”的事情.
在哪些情况下,允许带有类型参数的instanceof会导致故障,从而禁止它?
如果在运行时需要T,则需要在运行时提供它.这通常通过传递Class< T>来完成. T必须是.
class SomeClass {
final T t;
public SomeClass(Class tClass,T t) {
if(!tClass.isAssignableFrom(t.getClass()) throw new IllegalArgumentException("Must be a " + tClass);
this.t = t;
}
private SomeClass(T t) {
this.t = t;
}
public static SomeClass of(Class tClass,T t) {
if(!tClass.isAssignableFrom(t.getClass()) throw new IllegalArgumentException("Must be a " + tClass);
return new SomeClass(t);
}
}
// doesn't compile
SomeClass intSomeClass = SomeClass.of(Integer.class,"one");
Class clazz = Integer.class;
// compiles with a warning and throws an IAE at runtime.
SomeClass intSomeClass = (SomeClass) SomeClass.of(clazz,"one");
// compiles and runs ok.
SomeClass intSomeClass = SomeClass.of(Integer.class,1);
转载地址:http://ykyhp.baihongyu.com/