Java在通用方法中限制了参数

Mar*_*rco 10 java generics methods

我在泛型方法中使用有界参数测试了一些东西,我发现了一些奇怪的行为.
如果有人能够在下面的代码片段中解释这两个错误,那将会很棒.

想象一下,有两个类Class1,Class2都来自a 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

mer*_*ike 5

发生第一个编译错误是因为方法声明的类型参数是由调用者指定的,而不是方法实现.也就是说,给定

class Class3 extends BaseClass implements Interface { ... }
Run Code Online (Sandbox Code Playgroud)

来电者可以写信

Class3 c3 = new Class1().<Class3>getTwo();
Run Code Online (Sandbox Code Playgroud)

,但方法实现返回a Class2,它不是T= 的子类型Class3.

发生第二个编译错误,因为调用程序未显式指定的类型参数是从方法参数和方法返回值分配给的变量的类型推断出来的.这种推断在这里失败了.Java语言规范推荐的常用解决方法是在这种情况下明确指定类型参数(类型推断旨在为简单情况提供便利;它并不旨在涵盖所有情况).

至于如何正确声明这个类型参数,我需要知道你试图用这些声明完成什么.