【问题标题】:Proper use of Arraylist and Java Generics vs Vectors正确使用 Arraylist 和 Java 泛型与向量
【发布时间】:2009-12-24 05:51:27
【问题描述】:

我过去一直在使用向量,并且对它们非常熟悉。我听说 ArrayList 更快、更灵活。我不熟悉使用 ArrayListsJava Generics。我目前正在按如下方式使用它们并收到有关参数化的警告(我以为我通过声明它们 <String> 来做到这一点。

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

我在网上发现可以通过抑制方法中的警告来避免这种情况,如下所示。但是,这是一种变通方法,我宁愿了解数组列表如何工作并正确使用它们,而不是禁止因错误使用它们而发出警告。

@SuppressWarnings("unchecked")

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

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

【问题讨论】:

  • 您能否显示发出警告的整个方法(或至少是声明)。
  • 我正在做一个研究项目,所以我不想显示任何专有代码。我知道这会让事情变得更加困难:(
  • 如果你做 string s = file.getName(); arrayList.add(s);你还会得到错误吗?你用的是哪个版本的JDK?
  • 我曾多次尝试过(现在你建议这样做),但它并没有消除警告。
  • 听起来 file.getName() 以某种方式返回了一个对象。什么类是文件的实例化?如果您添加(S),您会收到相同的错误消息?

标签: java standards arraylist warnings conventions


【解决方案1】:

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

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

将代码绑定到特定实现是一种糟糕的形式。

Vectors 本身并没有错。它们基本上是所有方法都同步的 ArrayList。这可能会产生不必要的开销,但不会过度。

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

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

因此,当您将 List 用作返回类型、变量类型或参数类型时,请始终包含适当的泛型类型。

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

【讨论】:

  • 我需要查看更完整的代码 sn-p 来告诉您为什么会收到该警告。您传递的对象不是泛型类型,或者您使用的是裸泛型类型(即“List list”而不是“List list”)。
【解决方案2】:

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

【讨论】:

  • 我认为您的意思是:“您应该将方法签名更改为method(ArrayList&lt;String&gt; arrayList)”,无论如何,正如其他人所说,您真正应该将其更改为method(List&lt;String&gt; list)
  • 你的意思是void method(ArrayList&lt;String&gt; arrayList),或者更好的是void method(List&lt;String&gt; strs)
  • (似乎通用参数在答案中,但语法突出显示解释为 HTML 或以其他方式忽略它。用backticks 编辑答案。)
【解决方案3】:

警告是什么?对我来说这似乎很好,尽管您应该真正对其接口 List 进行编码。

【讨论】:

    【解决方案4】:

    您提到警告来自以下行:

    arrayList.add(file.getName());
    

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

    【讨论】:

    • 那么我能想到的唯一可能是您的方法中对变量“arrayList”的声明与您在此处显示的不同。是否有可能在方法中有不同的同名变量声明,这掩盖了您显示的声明。
    猜你喜欢
    • 2013-04-29
    • 2018-12-02
    • 2017-07-03
    • 2011-11-05
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多