以前你把我烧死了,我必须说我多次搜索这个问题,我仍然无法理解List <Object>和List <?>之间的区别
我读过的所有书都说在Java中,每个类都隐含着Object的子类.
但是我在这里看到了以下代码:
public static void printList(List<Object> list) {
for (Object elem : list)
System.out.println(elem + " ");
System.out.println();
}
Run Code Online (Sandbox Code Playgroud)
这段代码是错误的(故意用于教育目的),根据作者的原因是:
[...]只打印一个Object实例列表; 它不能打印List <Integer>,List <String>,List <Double>等,因为它们不是List <Object>的子类型
解决方案是:
public static void printList(List<?> list) {
for (Object elem: list)
System.out.print(elem + " ");
System.out.println();
}
Run Code Online (Sandbox Code Playgroud)
如您所见,唯一的区别是第一行:
public static void printList(List<Object> list) {
public static void printList(List<?> list) {
Run Code Online (Sandbox Code Playgroud)
这就是我的问题的原因:List <Object>和List <?>之间有什么区别?
毕竟是对象超类的全部与否?
如果有人可以帮我一个简单的解释(我是Java的新手),我将不胜感激.
先感谢您.
我试图理解类泛型如何工作,这一点对我来说没有意义.
例如,如果我有以下类:
class A<E> {
void go (E e) { }
}
class B extends A { }
Run Code Online (Sandbox Code Playgroud)
然后我试试
A<? extends A> a1 = new A<A>();
A<? extends A> a2 = new A<B>();
a1.go(new A()); // i get a compiler error
a2.go(new B()); // i get a compiler error
Run Code Online (Sandbox Code Playgroud)
go方法不应该接受A或A的任何子类吗?
谢谢 :)
为什么我不能这样做:
LinkedList<Fruit> myFruits = new LinkedList<Apple>();
Run Code Online (Sandbox Code Playgroud)
错误信息:
Type mismatch: cannot convert from LinkedList<Apple> to LinkedList<Fruit>
Run Code Online (Sandbox Code Playgroud)
以下区别在哪里?
Fruit fruit = new Apple();
Run Code Online (Sandbox Code Playgroud) 据我所知,a List<?>被定义为一些特定但未知类型的列表.因此无论参数类型是什么List,它都应该扩展,Object因为在Java中你不能有任何不扩展的类型Object.那么为什么以下代码无法编译?它是如何违反the的不变量的?listObj
List<?> listObj = returnSomeList();
listObj.add(new Object()); //Why does this not work ?
Run Code Online (Sandbox Code Playgroud) List<Object> list = new ArrayList<String>()
Run Code Online (Sandbox Code Playgroud)
当我使用上面的行编译器给我类型不匹配错误.但正如我所理解的,Object是String的超类,如果我创建了对象列表,那么它也应该接受String.那么为什么上述陈述是错误的.我正在寻找解释.