我没有用以下任何一种方式编译此代码:
List<List> a = new ArrayList();
List<List<?>> b = new ArrayList();
a = b; // incompatible types
b = a; // incompatible types
在泛型方面,java似乎没有考虑List
并List<?>
使用相同的类型。
这是为什么?还有一些不错的出路吗?
有一个具有以下签名的库函数: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 设置和收集。 我想数一数那个十字路口 我试试这个: 但我有一个错误: