Sup*_*tar 0 java generics inheritance
在这种情况下:
// in Bar.java:
public class Bar{
}
// in Foo.java:
public class Foo<T extends Bar> {
T[] vals;
public Foo(T[] initVals) {
vals = initVals;
}
public String toString() {
if (vals != null && T.class.isAssignableFrom(CharSequence.class)) { // <= error
return Arrays.toString(vals);
}
return "T is not an array of character sequences";
}
}
Run Code Online (Sandbox Code Playgroud)
注释行发生错误:
cannot select from a type variable
Run Code Online (Sandbox Code Playgroud)
如何判断是否T是一个字符序列数组?
你不能.在运行时,所有相关信息T都消失了.由于类型擦除,在运行时JVM只知道它T是某个子类Bar.
如果你有一个实例T,你可以试试getClass(),例如:
if (vals != null &&
vals.length > 0 &&
vals[0].getClass().isAssignableFrom(someOtherClass)) { ... }
Run Code Online (Sandbox Code Playgroud)
否则,您将不得不重构您的解决方案.例如,您可以T明确地传递类:
public class Foo<T> {
T[] vals;
Class<T> clazz;
public Foo(T[] initVals, Class<T> initClass) {
vals = initVals;
clazz = initClass;
}
public String toString() {
if (vals != null && clazz.isAssignableFrom(CharSequence.class)) { ... }
return "T is not an array of character sequences";
}
}
Run Code Online (Sandbox Code Playgroud)