作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我是一名优秀的程序员,十分优秀!