我有两个问题,行为...... 首先,为什么我不能这样做:
List<Object> object = new List<Object>();
第二,我有一个返回List<?>
的方法,如何将其转换为List<Object>
,我能够简单地投射它吗?
谢谢!
答案 0 :(得分:35)
为什么我不能这样做:
List<Object> object = new List<Object>();
您无法执行此操作,因为List
是一个接口,并且无法实例化接口。只有(具体)类可以。实现List
的具体类的示例包括ArrayList
,LinkedList
等。
以下是如何创建ArrayList
的实例:
List<Object> object = new ArrayList<Object>();
我有一个返回
List<?>
的方法,如何将其转换为List<Object>
向我们展示相关代码,我会更新答案。
答案 1 :(得分:4)
List<Object> object = new List<Object>();
您无法执行此操作,因为 列表 是一个界面,您无法创建任何界面的对象,换句话说,您无法实例化任何界面。此外,您可以将实现 List 的类的任何对象分配给其引用变量。例如,您可以这样做:
list<Object> object = new ArrayList<Object>();
此处 ArrayList 是一个实现 List 的类,您可以使用任何实现的类列表 即可。
答案 2 :(得分:2)
列表是一个界面,因此您无法实现它。使用它的任何实现,例如。
List<Object> object = new List<Object>();
关于清单: 你可以使用任何对象作为它的实例的通用参数:
List<?> list = new ArrayList<String>();
或
List<?> list = new ArrayList<Integer>();
使用List<Object>
时,此声明无效,因为它将是类型不匹配。
答案 3 :(得分:0)
要回答第二个问题,是的,您可以将List<?>
转换为任何类型的List<Object>
或List<T>
,因为?
(通配符)参数表示该列表包含任何 Object
的同源集合。但是,在编译时无法知道type
是什么,因为它只是导出的API的一部分 - 这意味着您无法看到插入List<?>
的内容。
以下是演员的演出方式:
List<?> wildcardList = methodThatReturnsWildcardList();
// generates Unchecked cast compiler warning
List<Object> objectReference = (List<Object>)wildcardList;
在这种情况下,您可以忽略该警告,因为为了在泛型类中使用对象,它必须是Object
的子类型。让我们假装我们试图在List<Integer>
实际包含String
s的集合时将其转换为// this code will compile safely
List<?> wildcardList = methodThatReturnsWildcardList();
List<Integer> integerReference = (List<Integer>)wildcardList;
// this line will throw an invalid cast exception for any type other than Integer
Integer myInteger = integerRefence.get(0);
。
.getClass()
请记住:泛型类型在运行时被删除。您不会知道集合包含什么,但您可以获取一个元素并在其上调用Class objectClass = wildcardList.get(0).getClass();
以确定其类型。
ansible_check_mode
答案 4 :(得分:0)
package com.test;
import java.util.ArrayList;
import java.util.List;
public class TEst {
public static void main(String[] args) {
List<Integer> ls=new ArrayList<>();
ls.add(1);
ls.add(2);
List<Integer> ls1=new ArrayList<>();
ls1.add(3);
ls1.add(4);
List<List<Integer>> ls2=new ArrayList<>();
ls2.add(ls);
ls2.add(ls1);
List<List<List<Integer>>> ls3=new ArrayList<>();
ls3.add(ls2);
m1(ls3);
}
private static void m1(List ls3) {
for(Object ls4:ls3)
{
if(ls4 instanceof List)
{
m1((List)ls4);
}else {
System.out.print(ls4);
}
}
}
}