正确使用Arraylist和Java Generics vs Vectors

时间:2009-12-24 05:51:27

标签: java standards arraylist warnings conventions

我过去一直在使用矢量,我对它们非常熟悉。我听说ArrayLists更快更灵活。我不熟悉使用ArrayListsJava Generics。我目前正在使用它们如下并接收有关参数化的警告(我认为我通过声明它们<String>进行了警告。

ArrayList<String> arrayList = new ArrayList <String> ();
...
//then within a method
arrayList.add(file.getName()); //<-This line triggers the warning.

我在网上发现,可以通过抑制方法中的警告来避免这种情况,如下所示。但是,这是一个解决方法,我宁愿了解arraylists如何正常工作和使用它们,而不是禁止警告错误地使用它们。

@SuppressWarnings("unchecked")

并且,如果有关于使用ArrayLists的某种惯例或标准,我也很想了解这些。

编辑:我收到的警告如下:类型安全:方法add(Object)属于原始类型ArrayList。对泛型类型ArrayList的引用应该参数化

4 个答案:

答案 0 :(得分:5)

首先,通过接口名称引用您的列表(作为变量,返回类型或参数类型),这样:

List<String> list = new ArrayList<String>();

将代码绑定到特定实现是不好的形式。

Vector没有任何内在错误。它们基本上是ArrayLists,其中所有方法都是同步的。这可能会产生不必要的开销,但不会过度。

至于抑制未经检查的警告,只有在你引用没有泛型参数的List时才需要这样做。例如:

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

每当使用List作为返回类型,变量类型或参数类型时,总是包含适当的泛型类型。

某些库可能不会为您提供该选项,但这些应该是您需要禁止未经检查的警告的唯一情况。

答案 1 :(得分:3)

也许您正在将arrayList传递给方法签名为void method(ArrayList arrayList)或更好void method(List arrayList)的方法,并且编译器会触发未经检查的警告。您应该将方法签名更改为void method(ArrayList<String> arrayList)或更好void method(List<String> list)

答案 2 :(得分:1)

警告是什么?虽然你应该真的编写它的接口List,但对我来说似乎很好。

答案 3 :(得分:0)

您提到警告来自以下行:

arrayList.add(file.getName());

arrayList.add(file.getName()); 如果file.getName()返回除“String”以外的任何值,那么您将遇到编译错误,如果“file.getName()”返回“String”,则不会有任何警告。