我有一个具有泛型类型的类:
class Foo<T> {
protected boolean validateType(Object obj){
if (obj instanceof T) {
return true;
}
return false;
}
}
测试:
Foo foo = new Foo<String>();
foo.validateType(new String()); // should return true
foo.validateType(new Long()); // should return false;
并且有一个函数需要根据泛型类型“T”验证对象,显然上面的代码有错误?
我该怎么做
最佳答案
您想要做的事情目前是不可能的 - 泛型是由 erasure 在 Java 中实现的,这意味着泛型参数在运行时不存在。它可供编译器进行类型检查,但在运行时无法区分 Foo<String>
和 Foo<Long>
之间的区别。
因此,如果您想要检查特定 token ,则必须自己执行此操作。进行此类检查的常见模式是使用 Class
对象,其优点是编译器可以对它们进行类型检查:
class Foo<T> {
private final Class<T> genericClass;
public Foo(Class<T> clazz) {
this.genericClass = clazz;
}
protected boolean validateType(Object obj){
return genericClass.isInstance(obj);
}
}
请注意,您的调用者现在需要自行传入 Class
对象;没有办法绕过这个要求,它不能由 Java 本身自动连接。
(此外,当 if (x) return true; else return false;
与 return x;
完全相同但更容易混淆且容易出错时,使用 ojit_code 是一个坏主意。)
关于java - 根据 gereric 'T' 类型验证对象实例类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11259202/