gpt4 book ai didi

泛型方法中的 Java 有界参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:57:21 25 4
gpt4 key购买 nike

我在泛型方法中测试了一些有界参数的东西,我发现了一些奇怪的行为。
如果有人能解释以下代码片段中的两个错误,那就太好了。

假设有两个类 Class1Class2 都从 BaseClass 扩展而来。 Class2 实现了一个接口(interface)。

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 语言规范推荐的通常解决方法是在这种情况下显式指定类型参数(类型推断旨在为简单情况提供便利;它并不旨在涵盖所有情况)。

至于如何正确声明此类型参数,我需要知道您试图通过这些声明完成什么。

关于泛型方法中的 Java 有界参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8554494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com