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

标签 java swing collections java-10

继续我之前在链接中的查询:Swing Issue on Java 10 ,我发现了更多问题(仅突出显示错误),这次我发现问题主要出现在迁移到 Java 10 后的 Collection API 中。

错误如下。想知道从 Java 8 迁移时 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

最佳答案

问题

如果仔细比较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出于兼容性原因是可能的。虽然可能会出现问题(实际上与下面相同),但原始类型无论如何都被认为是不安全的,因此这些都是可以预料的。

它不再在 Java 10 上编译,因为原始 API 想要返回 Enumeration<TreeNode> ,但您的覆盖不会那样做。相反,它返回一个 Enumeration的一个亚型。现在,对于 Enumeration这实际上不是问题,因为它是只读的(返回更具体的类型当然总是可以的),但编译器不知道(一个方法可以接受更具体的类型——那是不行的)。

要更详细地理解最后一个括号,假设它是 List<TreeNode>和一个 List<SnapshotLoadNode>反而。然后你的 API,用作 DefaultMutableTreeNode , 将返回调用者可以添加的列表 TreeNode -s 到。但是你的类(class)仍然认为它有一个子类型列表并且会得到类(class)转换异常 - 不好。如果没有原始类型,这种类型安全性的缺乏是 Not Acceptable ,因此编译器会提示。

解决方案

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

由于这不是一个选项,所以看起来您必须这样做:

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

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

关于与集合和泛型相关的 Java 10 迁移问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51590571/

相关文章:

php - Laravel LengthAwarePaginator 返回的数据不在单个对象中

带有比较器类的android rxjava排序列表

java - 自动将焦点转移到下一个编辑文本

java - 在自己的线程中执行类

java - 我如何检查一个框架在java中是否打开?

java - 将 BufferedReader 插入 JTextArea

java - 用空值填充数组

java - 使用 webstart 1.6 启动 1.4.2_12 应用程序时出现 MissingResourceException

java - eclipse RCP : clonePerspective returns null

java - 错误的整数值 :'javax. swing.JFormattedtextField