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

时间:2015-04-08 17:14:22

标签: 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.isAssignableFrom(CharSequence.class)) { // <= error
      return Arrays.toString(vals);
    }
    return "T is not an array of character sequences";
  }
}

注释行发生错误:

cannot select from a type variable

如何判断T是否为字符序列数组?

2 个答案:

答案 0 :(得分:5)

你做不到。在运行时,有关T的所有信息都消失了。由于类型擦除,在运行时JVM只知道TBar的某个子类。

如果您有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