在这种情况下:
// 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";
}
}
注释行发生错误:
cannot select from a type variable
如何判断T
是否为字符序列数组?
答案 0 :(得分:5)
你做不到。在运行时,有关T
的所有信息都消失了。由于类型擦除,在运行时JVM只知道T
是Bar
的某个子类。
如果您有T
的实例,则可以尝试使用getClass()
,例如:
if (vals != null &&
vals.length > 0 &&
vals[0].getClass().isAssignableFrom(someOtherClass)) { ... }
否则,您将不得不重构您的解决方案。例如,您可以明确地传递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";
}
}
答案 1 :(得分:2)
您不能拥有T.class
之类的内容。这首先是非法的表达。
但是,您正在寻找的是数组的Class
实例,其vals
类型为T[]
,而不是类型T
本身。在这种情况下你应该vals.getClass()
:
public String toString() {
if (vals != null && vals.getClass().isAssignableFrom(CharSequence[].class)) {
return Arrays.toString(vals);
}
return "T is not an array of character sequences";
}
P.S:不知道这种情况将如何变为现实。由于CharSequence
不会延长Bar
。