通用类型参数给出错误,但通配符类型参数不

时间:2016-11-30 17:34:20

标签: java generics

以下类型不会产生任何编译器警告:

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();

我想知道是否有一种方法可以使用泛型类型定义方法头本身,而无需在类上定义它。而且,我很好奇为什么通配符声明不提供和警告但是#34;等同于&#34;通用声明。

1 个答案:

答案 0 :(得分:1)

这两者非常不同。

在第一个中,调用者不知道返回的Class的类型参数是什么。除了扩展BaseType之外,调用者不能对该类型参数做出任何假设。该方法可以选择返回Class,其类型参数是其想要的BaseType的任何子类型,对调用者来说是未知的。

在第二种情况下,该方法是通用方法,T是方法的类型变量。这意味着调用者可以选择T为他们想要的任何东西,并期望该方法可以神奇地使用T作为该类型。值得注意的是,该方法没有接收任何参数,这意味着该方法在运行时没有任何关于T的信息,并且必须以某种方式弄清楚如何返回Class<T>。显然,这是不可能的,除非它总是返回null