- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
继续我之前在链接中的查询: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/
我最近开始从事一个 Sails 项目。它目前在迁移表下具有以下格式的迁移。 20160826122004-create_users_table.js 'use strict'; module.expo
当我尝试迁移时 doctrine:migrations:migrate ,我收到此异常:“元数据存储不是最新的,请运行 sync-metadata-storage 命令来解决此问题。”。这仅在尝试在生
我在 ec2 linux 7 上有一个 MarkLogic 服务器。我想将它迁移到 linux 6。我将 ebs 移动到新的 linux 6 并将其安装在 /var/opt/MarkLogic . 我
我对 OpenID 很好奇。虽然我同意统一凭证的想法很棒,但我有一些保留意见。什么是防止 OpenID 提供商发疯并持有他们拥有的 OpenID 帐户直到您支付 n 美元?如果我决定不喜欢这个提供商,
使用 SQL 很容易做到这一点,但我需要编写一个我不熟悉的 Knex 迁移脚本。以下代码在 order 表中行的末尾添加了 order_id 列。我想在 id 之后添加 order_id。我该怎么做?
使用 SQL 很容易做到这一点,但我需要编写一个我不熟悉的 Knex 迁移脚本。以下代码在 order 表中行的末尾添加了 order_id 列。我想在 id 之后添加 order_id。我该怎么做?
我想通过在 Yii2 中的迁移添加一个新列,使用以下代码: public function up() { $this->addColumn('news', 'priority', $this-
我正在尝试在 SQLDelight 的表中添加更多列。我做了一个迁移文件 1.sqm .在迁移文件中,它给出了找不到表的错误。 我的 build.gradle.kts: sqldelight {
我有一个与 Flyway DB 迁移相关的问题。通常如何管理处理相同 DB 模式的多个项目(微服务)。每个项目中的 Flyway 迁移脚本如果被其他项目修改,则不允许启动。他们是否有任何文档或最佳实践
我是 Laravel 的新手。我做了一份待办事项申请作为一项学校作业。我们必须使用迁移来创建我们的数据库。 我使用迁移创建了 2 个表。我的问题是:如果你第一次在你的电脑上运行这个项目,有没有办法自动
我正在尝试在 Laravel 中创建外键,但是当我使用 artisan 迁移表时,出现以下错误: [Illuminate\Database\QueryException] SQLSTATE[HY000
我从 Django 1.7 升级到 Django 1.9。我有多次迁移。升级后我无法再创建新的数据库。 问题是“django manage.py migrate”运行检查。检查导入应用程序 URL。这
我在创建数据迁移方面遇到了困难。我的应用程序使用两个数据库。我在 settings.py 中配置了数据库,并创建了一个像 Django docs 中一样的路由器. # settings.py DB_H
我有一个像这样的sql结构: CREATE TABLE resources ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, created_at
我正在尝试使用模式构建器向表添加枚举选项(不丢失当前数据集)。 我真正能够找到的关于列更改的唯一信息是 http://www.flipflops.org/2013/05/25/modify-an-ex
我尝试转移到一些 CMake 程序中,并且有一个从 xml 生成头文件的函数。 生成文件.am adaptor_glue.hpp: dbus_introspect.xml $(DBUSXX_X
我想将文件移至我的 iOS 应用程序的 CoreData 存储 ../Library/Application Support/MyApp/ 至 ../Documents/Stores/ 我可以使用 N
有没有人对数据迁移进出 NetSuite 有丰富的经验?我必须将 DB2 表导出到 MySQL,处理数据,然后导出到一个 CSV 文件中。然后获取帐户的 CSV 文件并再次操作数据以使帐户从我们的旧系
我正在尝试在 Django 上建立一个博客。我已经走到了创建模型的地步。他们在这里: from django.db import models import uuid class Users(mode
我最近使用 bluehost 上的 AutoSSL 工具将网站迁移到 HTTPS。我在内容中看到一些失真,例如缺少背景颜色、表格位移、缺少_logos 等。 有谁知道 HTTPS 迁移效果如何影响样式
我是一名优秀的程序员,十分优秀!