Generics and Class.asSubclass

2022-09-03 18:03:57

我一直认为以下内容应该有效。我得到了一个对象,我知道这是一个扩展某个类的地方。为了使它成为类型安全的,我想使用Class.asSubclass,就像下面的方法一样:Class<X>XXyz

private Class<? extends Xyz> castToXyzClass(Object o) {
    final Class<?> resultClass = (Class<?>) o;
    final Class<? extends Xyz> result = Xyz.class.asSubclass(resultClass);
    return result;
}

但是,在Eclipse中它不起作用,我看到的唯一解决方案是不受检查的强制转换。我敢打赌上面的代码必须工作,我已经用过这样的东西了......不知道这里出了什么问题。


答案 1

asSubclass()对它被调用的对象进行操作,而不是对其参数进行操作 - 不是人们习惯的参数,但它读起来很好。你只需要这样做:

final Class<? extends Xyz> result = resultClass.asSubclass(Xyz.class);

答案 2

这是一个有点令人困惑的名称,因为您没有获得表示子类的Class对象,而是获得了重新键入以反映它是某个类的子类的相同类对象。asSubclass

事实上,这种方法是相当单一的目的(我想你已经找到了它)......它是采用原始类或通配符类,并通过运行时检查获得更好的类型参数。当您的类型信息中没有间隙时,不需要它:

class Super {}
class Sub extends Super {}

//...
Class<Sub> subClass = Sub.class;

//both work, but the latter introduces a redundant runtime check
Class<? extends Super> subOfSuper1 = subClass;
Class<? extends Super> subOfSuper2 = subClass.asSubclass(Super.class);

推荐