gpt4 book ai didi

java - 从使用 泛化的通用方法返回 this

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

为什么我不能在 Java 中这样做:

public class TestClass {

public <T extends TestClass> T test(){
return this; // error here
}
}

据我了解,this 将始终是某个扩展 TestClass 的类的实例,那么为什么编译器不允许上面的代码?即使我将扩展 TestClassthis 的类型仍然适合 extends TestClass。我收到以下错误:

Error:(4, 16) java: incompatible types: TestClass cannot be converted to T

最佳答案

假设你有 SubTestClass extends TestClass,你写:

TestClass instance = new TestClass();
SubTestClass result = instance.test();

这对于您的 test() 类的签名是合法的,尽管是胡说八道 (1)。编译器将推断 T 是类 SubTestClass。然后很明显 TestClass 实例不是 instanceof SubTestClass。因此,在合法使用 test() 方法的情况下,返回 this 会导致类型不匹配,这就是编译器告诉您的。

使用您的 test() 签名,不可能返回除 null 以外的任何内容,因为 null 是您可以分配给的唯一值未知类型的变量。

让我解释一下最后一个声明(在评论中要求):test() 方法的实现必须返回一些与 T 类型匹配的值,并且具体类型(从调用情况推断为 SubTestClass)不能推断为方法 - 参数或实例字段中没有任何内容可以读出返回 的要求>SubTestClass 在这种情况下。在另一种调用情况下,可能需要返回 AnotherSubTestClass,但它无法区分第一种情况和第二种情况。

如果您返回 this(使用 (T) 转换使其通过编译器),它将在第一种或第二种或两种情况下失败.因此,如果没有很高的失败风险,您就无法做到这一点。

您可以成功分配给 SubTestClassAnotherSubTestClass 变量的唯一值是 null 值。因此,这是您可以从具有此类签名的方法中安全返回的唯一值。

(1) 拥有一个泛型方法,其中泛型类型不能从参数中推导出来,而只能从预期的结果类型中推导出来,这几乎是行不通的——该方法应该如何知道调用者的期望?

关于java - 从使用 <T extends TestClass> 泛化的通用方法返回 this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53683718/

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