与Collection和泛型相关的Java 10迁移问题

时间:2018-07-30 09:12:59

标签: java swing collections java-10

在链接Swing Issue on Java 10中,我的上一个查询继续进行,我发现了其他一些问题(仅突出显示错误),这一次,我发现问题主要是移至Java 10之后的Collection API的问题。

以下是错误。要知道从Java 8迁移时(从Collection / Generics的角度来看)Java 10中有什么重大变化。

    [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

1 个答案:

答案 0 :(得分:5)

问题

如果您仔细比较Java 8和10之间的DefaultMutableTreeNode中的代码,您会发现返回类型已生成:

// 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中。尽管可能会出现问题(实际上与以下内容相同),但原始类型仍然被认为是不安全的,因此可以预见。

它不再可以在Java 10上编译,因为原始API希望返回Enumeration<TreeNode>,但是您的覆盖不会这样做。相反,它返回子类型的Enumeration。现在,对于Enumeration来说这实际上不是问题,因为它是只读的(返回特定的类型当然总是可以的),但是编译器并不知道(方法可以接受更特定的类型类型-没关系)。

要更详细地了解最后一个括号,请假定它是List<TreeNode>List<SnapshotLoadNode>。然后,用作DefaultMutableTreeNode的API将返回一个列表,调用者可以向其中添加TreeNode -s。但是您的类仍然认为它具有一个子类型列表,并且会得到类强制转换异常-不好。没有原始类型,缺乏类型安全性是不可接受的,因此编译器会抱怨。

解决方案

如果DefaultMutableTreeNode是我的代码,我将更改breadthFirstEnumeration以返回Enumeration<? extends TreeNode>(我不知道,为什么不是这样)。那将使您的代码编译。

由于这不是一个选项,因此您似乎必须执行以下操作:

  • 松散更精确的类型信息,并将覆盖的返回类型更改为Enumeration<TreeNode>
  • 如果需要更精确的返回类型,请创建一个新方法:

    public Enumeration<?extends SnapshotLoadNode>
        breadthFirstEnumerationAsSnapshotLoadNode() { /*...*/ }