【发布时间】:2016-11-30 17:34:20
【问题描述】:
以下类型不会产生任何编译器警告:
public abstract Class<? extends BaseType> getSubclassType();
@Override
public Class<SubType> getSubclassType() {
return SubType.class;
}
以下具体方法会产生未经检查的强制转换编译器警告:
public abstract <T extends BaseType> Class<T> getSubclassType();
@Override
public <T extends BaseType> Class<T> getSubclassType() {
return (Class<T>) SubType.class;
}
有没有办法用泛型类型参数定义方法(在基类中)并在子类中返回适当的具体类型而不产生编译器警告?显然,我上面给出的两个示例都可以正常工作,我只是想知道是否有更正确的方法来定义该方法。注意:我确实知道我可以执行以下操作:
public abstract class BaseClass <T extends BaseType>
public abstract Class<T> getSubclassType();
我想知道是否有一种方法可以使用泛型类型定义方法标头本身,而无需在类上定义它。而且,我很好奇为什么通配符声明没有给出警告,但“等效”通用声明却给出了警告。
【问题讨论】:
-
在通配符示例中,
SubType.class的类型必然是Class<SubType>。但是,在通用程序中,程序无法隐式知道SubType.class是否真的扩展了BaseType,因此它会发出警告。至于避免这种情况的方法,我想不出。