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";
    }
}