Java 如何判断类型变量是否从类继承?
在这种情况下:Java 如何判断类型变量是否从类继承?,java,inheritance,generics,Java,Inheritance,Generics,在这种情况下: // 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.isAssignable
// 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";
}
}
我如何判断
T
是否是字符序列数组?不能有类似T.class的东西。首先,这是一个非法的表达
但是,您要查找的是数组的类
实例,它是类型为T[]
的vals
,而不是类型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";
}
附言:不知道这种情况怎么会是真的。由于CharSequence
不扩展Bar
您不能。在运行时,关于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";
}
}
公共类Foo{
T[]vals;
课堂讨论;
公共Foo(T[]initVals,类initClass){
VAL=初始值;
clazz=initClass;
}
公共字符串toString(){
如果(vals!=null&&clazz.isAssignableFrom(CharSequence.class)){…}
返回“T不是字符序列数组”;
}
}
怎么不能扩展条,也不能成为数组?@JBNizet你说得对。对不起,我不得不走了,我只是在胡闹。修正。第二种解决方案有什么用,因为第一种方法可以很好地工作?@RohitJain。第二种解决方案并不等同于第一种解决方案。首先,当vals[0]
可以null
时,它也会工作。其次,vals
实际上可以属于T[]
的一个子类型,在这种情况下,vals.getClass()
与“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";
}
}