当前位置: 首页 > 面试题库 >

清单>和列表 是Java中不兼容的类型

侯博裕
2023-03-14
问题内容

我没有用以下任何一种方式编译此代码:

List<List> a = new ArrayList();
List<List<?>> b = new ArrayList();

a = b; // incompatible types
b = a; // incompatible types

在泛型方面,java似乎没有考虑ListList<?>使用相同的类型。

这是为什么?还有一些不错的出路吗?

有一个具有以下签名的库函数:public <T> Set<Class<? extends T>> getSubTypesOf(final Class<T> type)。对于作为参数传递的简单类型,此方法很好用,但在泛型的情况下,结果未用通配符参数化,从而导致javac抱怨原始类型。我想将结果传播到我的应用程序的其余部分,Set<Class<? extends GenericTypeHere<?>>>但是简单的强制转换无法按我期望的那样工作。

编辑:解决方案

感谢您的回答,这就是我最终如何使它工作的方式:

@SuppressWarnings({"rawtypes", "unchecked"})
private static Set<Class<? extends GenericTypeHere<?>>> factoryTypes() {
    return (Set) new Reflections("...").getSubTypesOf(GenericTypeHere.class);
}

问题答案:

好的,这是由于语义上的细微差异。

List

这是原始类型的List,这相当于T是类型的Object。所以就像说:

List<Object>

现在,编译器知道一个事实,无论发生什么,这都是type的子类Object。如果可以的话..

List myList = new ArrayList();
myList.add(new Object());

它将正常工作!这是因为Object相同或类型的某种派生。

List<?>

从字面上看,这是 一个未知列表 (Java
Docs
)。我们甚至都不知道这里的事物的子类是type
Object。实际上,?类型本身就是未知类型。没关系Object!这就是为什么当您尝试去做时..

List<?> myList = new ArrayList<?>();
myList.add(new Object());

您得到一个编译时错误!



 类似资料:
  • 以下一些不兼容的语法功能列表,不完全。 不支持类的定义 函数外作用域不是全局作用域 include/require/eval 执行的代码是引入代码作用域 对变量引用缺乏支持 extract() 函数使用无效 不支持可变变量 不允许使用 $string [n] 的方式获取字符串中的某个字符 双引号字符串中引入变量,但不可引入数组项 不存在的常量不会自动转换为字符串 函数定义中不支持类型约束 标识符不

  • 我有一个多级类结构,希望将它们的实现传递给一个可以对它们调用函数的函数,但我得到了一个错误。 以下是代码: 确切的错误消息: 我需要函数中的列表来扩展,并实现,因为我对它们调用某些函数。 为什么会这样?如果我更改的签名,并且只传递一个,它可以正常工作,但我需要它来处理多个。 我的选择是什么? 我尝试了多个java版本(1.8),都是一样的。

  • 我试图从一个流列表,但我有一个例外。 这是一个带有对象列表的电影对象。 以下是电影: 我在列表中添加元素: 我有一个编译器错误:

  • 我的问题是:给出一份人员名单,把所有学生都退回来。 以下是我的类: Person类 学生班级 方法 我收到一个编译错误: 如何使用stream返回列表中的所有学生而不出现此错误。

  • 错误:(65,52)java:不兼容类型:推理变量U的边界不兼容等式约束:akka。http。javadsl。模型HttpResponse下限:com。我的演员。聊天演员。聊天信息 下面这行代码显示了错误: 这里是HttpResponse是Akka Http的。 我不知道它在说什么。解决它的方法应该是什么?

  • JDK 1.8 设置和收集。 我想数一数那个十字路口 我试试这个: 但我有一个错误: