在List <! - ? - >中添加元素

时间:2016-03-31 11:37:38

标签: java generics collections

我创造了这个:

List<?> result = new ArrayList<>();

我试图这样做:

result.add("");

Java编译器告诉:

  

类型List中的方法add(capture#9-of?)不适用于参数(String)

有什么想法吗?我怎么能解决它?

5 个答案:

答案 0 :(得分:3)

拥有List<?>时,null是您可以添加的唯一参考。所以这应该有效:

 List<?> result = new ArrayList<>();
 result.add(null);

但是,这是不允许的:

 result.add("");

原因是编译器无法完全确定您尝试添加的引用是否与编译时通配符(?)类型中的未知匹配。

为了允许向String添加List引用,您应该将其定义为:

List<String> result = new ArrayList<>();
result.add("");

答案 1 :(得分:2)

重要的是要注意List<Object>List<?>不一样。您可以将对象或Object的任何子类型插入List<Object>。但您只能将null插入List<?>

使用通配符(?)指定unbounded wildcard type,例如List<?>。这称为未知类型列表。有两种情况,无界通配符是一种有用的方法:

  • 如果您正在编写可以使用Object类中提供的功能实现的方法。
  • 当代码使用泛型类中不依赖于类型参数的方法时。例如,List.sizeList.clear。事实上,Class<?>经常被使用,因为Class<T>中的大部分方法都不依赖于T

考虑以下方法,printList

 public static void printList(List<Object> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
 }

printList的目标是打印任何类型的列表,但它无法实现该目标 - 它只打印一个Object实例列表;它无法打印List<Integer>List<String>List<Double>等,因为它们不是List<Object>的子类型。要编写通用printList方法,请使用List<?>

public static void printList(List<?> list) {
   for (Object elem: list)
       System.out.print(elem + " ");
   System.out.println();
}

因为对于任何具体类型A,List<A>List<?>的子类型,您可以使用printList打印任何类型的列表:

List<Integer> li = Arrays.asList(1, 2, 3);
List<String>  ls = Arrays.asList("one", "two", "three");
printList(li);
printList(ls);

Oracle official documentation - Wildcards

上详细了解相关信息

答案 2 :(得分:1)

<?>它被称为wildcard类型,你可以做这样的事情:

 List<SomeClass> result = new ArrayList<>();

SomeClass可以是Stringanother

答案 3 :(得分:0)

需要定义泛型类型,例如当你想要添加“”(String)时,你可以这样做:

public static void main(String[] args) {
    List<String> result = new ArrayList<String>();
    result.add("");
}

答案 4 :(得分:0)

如果您只在Feed中输入值时才知道对象,那么您可以使用下面给出的代码。

    public  <T>  void feedList(T value)
{
    List<T> genericList = new ArrayList<T>();
    genericList.add(value);

}
feedList("test");