我的同事遇到了一个奇怪的编译器行为,我对此感到非常惊讶。主要问题是如何解析Java中的泛型方法,以及它与类的泛型有何关系。
这是例子。我有一些通用类<T>
,它具有通用方法<P>
。这两个泛型无关
public class BaseClass<T> {
public <P extends Iface> P getIface() {
return null;
}
}
在这里我们可以看到<P extends Iface>
。因此,我应该能够将方法getIface()
的结果声明为Iface
的子级。像这样:
IfaceImpl impl = new BaseClass<String>().getIface();
目前,它可以正常工作,但是仅在使用通用声明BaseClass
之前。如果我省略泛型,则会给我编译错误:
IfaceImpl iface = new BaseClass().getIface();
在这种情况下,我只能将getIface()
的结果分配为Impl
Impl iface = new BaseClass().getIface();
因此,基本上,如果我们有一个通用类,并将其定义为原始类型,则将无法解析其上的通用方法。但是为什么呢?似乎不是功能,是否由于某些限制或向后兼容性问题而实现了此行为?