gpt4 book ai didi

java - 为什么编译器无法推断 Java 中内部类的泛型类型?

转载 作者:行者123 更新时间:2023-12-02 02:11:11 25 4
gpt4 key购买 nike

class A<T>
{
class InnerA<U>
{}
}

public class Main
{
public static void main(String[] args)
{
A<Integer>.InnerA<String> var = new A<>().new InnerA<>();
}
}

编译上述代码片段时,会导致编译时错误,提示“不兼容的类型:无法推断 A.InnerA<> 的类型参数。在我看来,编译器应该能够推断类型为 InnerA<String>

为什么不能这样做?如果有人能解释它在幕后是如何工作的,那将会很有帮助。

最佳答案

编译器错误消息具有误导性。

如果表达式是其结果实际被赋值的表达式,则编译器只能从赋值的左侧推断表达式的类型。在您的示例中,new A<>()未分配,但仅用于内部类的合格实例化。由于 new A<>() 没有赋值上下文,编译器推断 new A<Object>() .

对于.new InnerA<>() ,存在一个赋值上下文,编译器尝试使用赋值的左侧推断结果类型,但失败,因为 A的类型已经不兼容。在缩短的编译器消息中,无法推断 InnerA 的类型可见,但不是 A 类型参数不匹配的原因.

长错误消息看起来像

Main.java:11: error: incompatible types: cannot infer type arguments for A.InnerA<>
A<Integer>.InnerA<String> var = new A<>().new InnerA<>();
^
reason: no instance(s) of type variable(s) U exist
so that A<Object>.InnerA<U> conforms to A<Integer>.InnerA<String>

where U is a type-variable:
U extends Object declared in class A.InnerA

因此问题仍然被报告为“找不到 U 的类型” ”但我们也可以看到,更深层次的原因是没有 U可以解决 A<T> 类型不匹配的问题.

我们还可以通过将行更改为来演示实际原因

A<Integer>.InnerA<String> var = new A<>().new InnerA<String>();

InnerA 提供正确的类型现在得到

incompatible types:
A<Object>.InnerA<String> cannot be converted to A<Integer>.InnerA<String>

或将行更改为

A<Integer>.InnerA<String> var = new A<Integer>().new InnerA<>();

这将解决问题,就像现在 A具有正确的类型和 InnerA 的类型可以从左侧推断。


如果您有genericMethod1().method2(),也会出现同样的问题

关于java - 为什么编译器无法推断 Java 中内部类的泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67738489/

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