也许有人问过,但我找不到了。
请告诉我以下两者的确切区别:
ArrayList list = new ArrayList();
并且
ArrayList<?> list = new ArrayList();
我不确定这两者之间的确切区别是什么。
谢谢...
也许有人问过,但我找不到了。
请告诉我以下两者的确切区别:
ArrayList list = new ArrayList();
并且
ArrayList<?> list = new ArrayList();
ArrayList<?>
的意思是“任何类型”。换句话说,任何类型的 ArrayList
都可以分配给这样的变量。这可能是 ArrayList<Integers>
,ArrayList<JButton>
或其他任何类型。仅使用通配符,而不使用关键字 super(后跟类型),意味着您不能向定义为 ArrayList<?>
的列表添加任何内容。但是,仅使用 ArrayList
意味着旧式无类型的 ArrayList
,您可以执行各种操作,包括 add
。List<?> list;
List<Integer> ints = new ArrayList<Integer>();
List<Integer> strings = new ArrayList<Integer>();
list = ints; // valid
list = strings; // valid
list.add("new"); // compile error
更新:
假设我有以下方法:
void insert(List list) {
// loop through list, do whatever you like
list.add("my string"); // dangerous operation
}
insert(ints)
,编译器会生成一个警告,但不会阻止我将字符串添加到整数列表中。将方法更改为以下内容:void insert(List<?> list) {
// loop through list, do whatever you like
list.add("my string"); // compiler error on this dangerous operation
}
这会阻止我执行此操作。
ArrayList list = new ArrayList();
list.add(new Dog());
list.add(new Person());
list.add("Test");
对于 ArrayList<?> list = new ArrayList();
我们使用泛型声明了一个可以接受任何对象的数组列表,使用通配符?
关键在于我们无法向该数组列表中添加元素。
这段代码甚至无法编译:
ArrayList<?> list = new ArrayList();
list.add("test");
更新:
我认为在泛型中,“?”通配符的唯一目的是通过“extends”关键字进行耦合。
ArrayList<? extends Animal> list = new ArrayList<Dog>();
public void foo(List<?> list) { }
?
的含义,这是导致编译错误的原因(我猜他们不会只为了让代码产生编译错误而添加这个特性)。 - SJuan76ArrayList list = new ArrayList();
ArrayList<String> list = new ArrayList<String>();
该
<?>
通配符参数表示“某些东西”,例如String、Integer等。
请注意,ArrayList<?> list = new ArrayList()
是无效的语法;通常通配符会用在方法参数等地方。
ArrayList < ? > 表示类型未知的数组列表,它被称为通配符类型。
使用通配符,会发生以下情况
Collection<?> c = new ArrayList<String>();
c.add(new Object()); // Compile time error