我创造了这个:
List<?> result = new ArrayList<>();
我试图这样做:
result.add("");
Java编译器告诉:
类型List中的方法add(capture#9-of?)不适用于参数(String)
有什么想法吗?我怎么能解决它?
答案 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<?>
。这称为未知类型列表。有两种情况,无界通配符是一种有用的方法:
List.size
或List.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);
上详细了解相关信息
答案 2 :(得分:1)
<?>
它被称为wildcard
类型,你可以做这样的事情:
List<SomeClass> result = new ArrayList<>();
SomeClass可以是String
或another
。
答案 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");