如何判断类型变量是否继承自类?

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是一个字符序列数组?

Hoo*_*pje 5

你不能.在运行时,所有相关信息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)

  • @RohitJain.第二种解决方案不等同于第一种解决方案.首先,当`vals [0]`可以为'null`时,它也会起作用.其次,`vals`实际上可以属于`T []`的子类型,在这种情况下,`vals.getClass()`与"T []`"不同. (3认同)