- 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/
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
我正在尝试做类似的事情: SELECT SUM( CASE WHEN ( AND EXISTS(SELECT 1
我想问如何在外部 ng-repeat 内部正确使用内部 ng-repeat: 这意味着你想使用这样的东西: {{milestone.id}} {{
我希望在 wordpress 的仪表板内编辑 css 样式并且如果可能的话不必编辑 php 文件。 我知道至少可以编辑一些属性,所以我希望我可以直接在仪表板中编辑所有属性。 更具体地说如何更改自定义类
我在安装在 windows10 上的 vmware 中的 Ubuntu 上安装了伪分布式独立 hadoop 版本。 我从网上下载了一个文件,复制到ubuntu本地目录/lab/data 我在 ubun
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
在我的一些测试帮助程序代码中,我有一个名为 FakeDbSet(Of T) 的 IDbSet(Of T) 实现,它模拟了许多 EF 行为,但没有实际的数据库。我将类声明为 Friend ,因为我想强制
我正在寻找 Cassandra/CQL 的常见 SQL 习语 INSERT INTO ... SELECT ... FROM ... 的表亲。并且一直无法找到任何以编程方式或在 CQL 中执行此类操作
如何防止内部 while 循环无限运行?问题是,如果没有外部 while 循环,内部循环将毫无问题地运行。我知道它必须对外循环执行某些操作,但我无法弄清楚是什么导致了问题。 import java.u
我正在努力学习更多有关 C++ 的知识,但在国际象棋程序中遇到了一些代码,需要帮助才能理解。我有一个 union ,例如: union b_union { Bitboard b; st
这是我项目网页中的代码片段。这里我想显示用户选择的类别,然后想显示属于该类别的主题。在那里,用户可以拥有多个类别,这没有问题。我可以在第一个 while 循环中打印所有这些类别。问题是当我尝试打印主题
我想知道如何在 swing 中显示内部框架。这意味着,当需要 JFrame 时,通常我所做的是, new MyJFrame().setVisible(true); 假设之前的表单也应该显示。当显示这个
我最近发现了一些有趣的行为,这让我想知道对象如何知道存在哪些全局变量。例如,假设我有一个文件“test.py”: globalVar = 1 toDelete = 2 class Test(objec
我知道它已经在这里得到回答: google maps drag and drop objects into google maps from outside the Map ,但这并不完全是我所需要的
我目前正在学习Javascript DOM和innerHTML,发现在理解innerHTML方面存在一些问题。 这是我的代码:http://jsfiddle.net/hphchan/bfjx1w70/
我构建了一个布局如下的库: lib/ private_class_impl.cc private_class_decl.h public_class_impl.cc include/
我有一个使用 bootstrap 3 的组合 wordpress 网站。它基本上是一个图像网格。当屏幕展开时,它会从三列变为四列。移动时它是一列。 我想出了如何调整图像的顶部和底部边距,但我希望图像的
我正在试用 MSP-EXP430G2 的教程程序,使用 Code Composer Studio 使 LED 闪烁。最初,它有一个闪烁的无限循环: for(;;) // This emp
我是一名优秀的程序员,十分优秀!