我通过泛型方法测试了有限参数,发现了一些奇怪的行为.
这将是伟大的如果有人可以解释下面的代码片段中的两个错误.
这将是伟大的如果有人可以解释下面的代码片段中的两个错误.
想象一下,Class1和Class2有两个类从BaseClass扩展. Class2实现了一个接口.
在Class1中,我有一个方法可以通过以下方式返回Class2的一个实例:
public class Class2 extends BaseClass implements Interface { @Override public void method() { System.out.println("test"); //$NON-NLS-1$ } } public class Class1 extends BaseClass { public <T extends BaseClass & Interface> T getTwo() { return new Class2(); // Error: Type mismatch: cannot convert from Class2 to T } public static void main(String[] args) { Interface two = new Class1().getTwo(); // Error: Bound mismatch: The generic method getTwo() of type Class1 is // not applicable for the arguments (). The inferred type Interface is // not a valid substitute for the bounded parameter <T extends BaseClass // & Interface> System.out.println(two); } }
解决方法
出现第一个编译错误是因为方法声明的类型参数由调用者指定,而不是方法实现.也就是说
class Class3 extends BaseClass implements Interface { ... }
一个来电者可以写
Class3 c3 = new Class1().<Class3>getTwo();
,但是方法实现返回一个Class2,它不是T = Class3的子类型.
发生第二个编译错误是因为调用者未明确指定的类型参数是从方法参数和方法返回值分配给变量的类型推断的.这个推论在这里失败了. Java语言规范推荐的常见解决方法是在这种情况下明确指定类型参数(类型推断是为了方便简单的情况;它不旨在涵盖所有情况).
至于如何正确声明这个类型的参数,我需要知道你正在尝试用这些声明完成什么.