继续我之前在链接中的查询:Java 10 上的 Swing 问题 https://stackoverflow.com/questions/51555030/swing-issue-on-java-10?noredirect=1#comment90144695_51555426,我发现了更多问题(仅突出显示错误),这次我发现问题主要出现在迁移到 java 10 后的 Collection API 中。
下面是错误。想知道从 Java 8 迁移时 Java 10 是否有任何重大变化(从 Collection/Generics 的角度来看)。
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\tree\WMTreeNode.java:159: error: breadthFirstEnumeration() in WMTreeNode cannot override breadthFirstEnumeration() in DefaultMutableTreeNode
[javac] public Enumeration<?extends WMTreeNode> breadthFirstEnumeration() {
[javac] ^
[javac] return type Enumeration<? extends WMTreeNode> is not compatible with Enumeration<TreeNode>
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\tree\WMTreeNode.java:158: error: method does not override or implement a method from a supertype
[javac] @Override
[javac] ^
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\tree\WMTreeNode.java:164: error: depthFirstEnumeration() in WMTreeNode cannot override depthFirstEnumeration() in DefaultMutableTreeNode
[javac] public Enumeration<?extends WMTreeNode> depthFirstEnumeration() {
[javac] ^
[javac] return type Enumeration<? extends WMTreeNode> is not compatible with Enumeration<TreeNode>
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\tree\WMTreeNode.java:163: error: method does not override or implement a method from a supertype
[javac] @Override
[javac] ^
[javac] ^
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\ui\tree\WMTreeNode.java:298: error: no suitable method found for sort(Vector<TreeNode>)
[javac] Collections.sort(children);
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\load\LoadNode.java:90: error: breadthFirstEnumeration() in LoadNode cannot override breadthFirstEnumeration() in DefaultMutableTreeNode
[javac] public Enumeration<?extends LoadNode> breadthFirstEnumeration() {
[javac] ^
[javac] return type Enumeration<? extends LoadNode> is not compatible with Enumeration<TreeNode>
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\load\LoadNode.java:95: error: depthFirstEnumeration() in LoadNode cannot override depthFirstEnumeration() in DefaultMutableTreeNode
[javac] public Enumeration<?extends LoadNode> depthFirstEnumeration() {
[javac] where T is a type-variable:
[javac] T extends Object declared in class Class
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\automation\plot\CopyCountJobParameterDescriptor.java:113: error: incompatible types: Integer cannot be converted to CAP#1
[javac] final boolean outOfRange = (model.getMinimum().compareTo(i) > 0) || (model.getMaximum().compareTo(i) < 0);
[javac] ^
[javac] where CAP#1 is a fresh type-variable:
[javac] CAP#1 extends Object from capture of ?
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\automation\plot\CopyCountJobParameterDescriptor.java:113: error: incompatible types: Integer cannot be converted to CAP#1
[javac] final boolean outOfRange = (model.getMinimum().compareTo(i) > 0) || (model.getMaximum().compareTo(i) < 0);
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\load\SnapshotLoadNode.java:48: error: breadthFirstEnumeration() in SnapshotLoadNode cannot override breadthFirstEnumeration() in DefaultMutableTreeNode
[javac] public Enumeration<?extends SnapshotLoadNode> breadthFirstEnumeration() {
[javac] ^
[javac] return type Enumeration<? extends SnapshotLoadNode> is not compatible with Enumeration<TreeNode>
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\load\SnapshotLoadNode.java:53: error: depthFirstEnumeration() in SnapshotLoadNode cannot override depthFirstEnumeration() in DefaultMutableTreeNode
[javac] public Enumeration<?extends SnapshotLoadNode> depthFirstEnumeration() {
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\favorites\FavoritesTreeNode.java:30: error: breadthFirstEnumeration() in FavoritesTreeNode cannot override breadthFirstEnumeration() in DefaultMutableTreeNode
[javac] public Enumeration<?extends FavoritesTreeNode> breadthFirstEnumeration() {
[javac] ^
[javac] return type Enumeration<? extends FavoritesTreeNode> is not compatible with Enumeration<TreeNode>
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\favorites\FavoritesTreeNode.java:35: error: depthFirstEnumeration() in FavoritesTreeNode cannot override depthFirstEnumeration() in DefaultMutableTreeNode
[javac] public Enumeration<?extends FavoritesTreeNode> depthFirstEnumeration() {
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\save\SaveNode.java:113: error: breadthFirstEnumeration() in SaveNode cannot override breadthFirstEnumeration() in DefaultMutableTreeNode
[javac] public Enumeration<?extends SaveNode> breadthFirstEnumeration() {
[javac] ^
[javac] return type Enumeration<? extends SaveNode> is not compatible with Enumeration<TreeNode>
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\src\com\osm\datamgmt\ui\save\SaveNode.java:118: error: depthFirstEnumeration() in SaveNode cannot override depthFirstEnumeration() in DefaultMutableTreeNode
[javac] public Enumeration<?extends SaveNode> depthFirstEnumeration() {
[javac] ^
[javac] C:\WorkSpace\JAVA10\oswm\rel20.10_Patches\WorkManager\OSMWebServices\src\java\com\osm\webservices\legacy\util\MessageAttachmentHandler.java:76: error: cannot find symbol
[javac] attachment.setRawContent(new BufferedInputStream(new FileInputStream(file)),
[javac]
^
WMTreeNode
正在延伸javax.swing.tree.DefaultMutableTreeNode
.
问题
如果你仔细比较一下代码DefaultMutableTreeNode
在 Java 8 和 10 之间,您将看到返回类型被泛化:
// Java 8 uses `Enumeration` as a "raw type"
public Enumeration breadthFirstEnumeration() { /*...*/ }
// Java 10 uses `Enumeration` as intended: with a type parameter
public Enumeration<TreeNode> breadthFirstEnumeration() { /*...*/ }
你的代码是这样的:
public Enumeration<?extends SnapshotLoadNode> breadthFirstEnumeration() { /*...*/ }
您的代码可以在 Java 8 上编译,因为将泛型添加到raw type https://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html出于兼容性原因是可能的。虽然可能存在问题(实际上与下面相同),但原始类型无论如何都被认为是不安全的,因此这些都是可以预料到的。
它不再在 Java 10 上编译,因为原始 API 想要返回一个Enumeration<TreeNode>
,但你的覆盖不会这样做。相反,它返回一个Enumeration
的一个子类型。现在,对于一个Enumeration
这实际上不是问题,因为它是只读的(当然返回更具体的类型总是可以的),但编译器不知道这一点(方法可以接受更具体的类型 - 这是不行的)。
要更详细地理解最后一个括号,假设它是List<TreeNode>
and a List<SnapshotLoadNode>
反而。然后你的API,用作DefaultMutableTreeNode
,将返回调用者可以添加的列表TreeNode
-s 到。但你的类仍然认为它有一个子类型列表,并且会得到类转换异常 - 不好。如果没有原始类型,这种类型安全性的缺乏是不可接受的,因此编译器会抱怨。
解决方案
If DefaultMutableTreeNode
我会改变我的代码吗breadthFirstEnumeration
回来Enumeration<? extends TreeNode>
(我不知道为什么情况并非如此)。这将使你的代码编译。
因为这不是一个选项,所以看起来你必须这样做:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)