列出<object>和List <! - ? - > </object>

时间:2012-04-03 06:32:36

标签: java list object arraylist

我有两个问题,行为...... 首先,为什么我不能这样做:

List<Object> object = new List<Object>();

第二,我有一个返回List<?>的方法,如何将其转换为List<Object>,我能够简单地投射它吗?

谢谢!

5 个答案:

答案 0 :(得分:35)

  

为什么我不能这样做:

List<Object> object = new List<Object>();

您无法执行此操作,因为List是一个接口,并且无法实例化接口。只有(具体)类可以。实现List的具体类的示例包括ArrayListLinkedList等。

以下是如何创建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);
             }

        }
    }

}