Java 为什么';下一行是否编译?

Java 为什么';下一行是否编译?,java,generics,arraylist,compiler-errors,Java,Generics,Arraylist,Compiler Errors,我正在尝试创建一个arraylist,它可以通过使用带有无界通配符的泛型来包含任何类型的对象 ArrayList<?> params = new ArrayList<?>(); 解决问题的一个简单方法是使用ArrayList: ArrayList params=new ArrayList(); ?运算符引用所有类型未知的对象,因此使用它添加已知类型的对象(例如字符串)将导致错误,如上所述。您根本不允许这样做。它是这样说的: 如果TypeArguments紧跟在new

我正在尝试创建一个arraylist,它可以通过使用带有无界通配符的泛型来包含任何类型的对象

ArrayList<?> params = new ArrayList<?>(); 

解决问题的一个简单方法是使用
ArrayList

ArrayList params=new ArrayList();

运算符引用所有类型未知的对象,因此使用它添加已知类型的对象(例如字符串)将导致错误,如上所述。

您根本不允许这样做。它是这样说的:

如果TypeArguments紧跟在new之后,或紧跟在()之前,则如果任何类型参数是通配符(§4.5.1),则为编译时错误

列表实例从不具有有界类型:列表始终是包含特定类型元素的列表

只有列表变量可以有界,才能在这些边界内存储具有特定类型元素的列表

所以,这很好:

ArrayList<?> params = new ArrayList<SomeType>(); 
ArrayList params=new ArrayList();

ArrayList params=new ArrayList();
这并不是说你不能在RHS上使用边界:

new ArrayList<List<?>>()

new ArrayList
不是通配符(因为在语法上通配符总是以
开头)。

您不能编写
new ArrayList
,因为没有
ArrayList
这样的东西

每个ArrayList都有一个特定的类型。当您编写
ArrayList params
时,您会告诉编译器:“这个变量将包含一个ArrayList,它的元素是一个特定的类型,比如字符串或数字,但当我写这行代码时,我不知道该类型是什么。”


因此,您可以将ArrayList引用为具有编译时未知的类型,但无论变量如何引用,每个现有ArrayList都有一个实际的类型。当代码创建ArrayList时,必须指定该类型。

为什么不仅仅是
ArrayList
?我知道我可以使用ArrayList,但我想知道如何使用无界数组d泛型。列表实例从不具有有界类型:列表始终是具有特定类型元素的列表。只有列表变量可以有界,以便在这些边界内存储特定类型的列表。@Carcigenicate为什么不仅
new ArrayList()
?@coderboi27一个编译而另一个不编译的事实表明它是不同的。不要将
对象
用作集合的泛型参数。这只比原始类型稍微好一点。@Turing85如何判断它只比原始类型稍微好一点?
对象
与任何其他类型都不一样:如果如果你想产生和使用任何类型的元素,
Object
是你应该使用的。@而且你还可以使用泛型来保证类型安全。在大多数情况下,
Object
不是你想要的,你最终还是会进行强制转换。我知道OPs方法并没有为其他任何东西留下太多空间,但它表明我发现了一个缺陷n系统。@Turing85但是如果您需要的话,
列表
是一个有效的选择。它不像原始类型,因为您不能将
列表
传递给需要
列表
的方法,而您可以传递原始
列表
@AndyTurner,这就是我所说的“稍微好一点”=)
ArrayList<?> params = new ArrayList<SomeType>(); 
ArrayList<?> params = new ArrayList<>();
new ArrayList<List<?>>()