【问题标题】:Java Generics beginner - Compiler warning on type safe declaration and instantiationJava 泛型初学者 - 关于类型安全声明和实例化的编译器警告
【发布时间】:2011-11-28 10:04:57
【问题描述】:

如果我像下面这样声明和实例化一个新的类型安全集合,编译器会抛出一个警告

List<String> list = new ArrayList(); // compiler warning
List<String> anotherList = new ArrayList<String>(); //this is normal and ok.

列表对象似乎是类型安全的,因为我不能在其中放入除 String 之外的任何其他对象。那么,使用这样的声明有什么陷阱吗?

【问题讨论】:

  • 你是对的,在这种情况下它是安全的,但如果你将声明和实例化分开,你会很高兴看到这样的警告,提醒你使用类型化集合避免运行时意外。养成尽可能指定类型的习惯对您来说是一件好事。
  • 在当前版本的Java SE中,可以写List&lt;String&gt; list = new ArrayList&lt;&gt;();。可惜你不能写,比如List&lt;String&gt; list = new();,但它有点帮助。

标签: java generics


【解决方案1】:

因为你可以这样做:

ArrayList foo = new ArrayList();
foo.add(new Integer(5));
List<String> list = foo;  // compiler warning

但这会破坏List&lt;String&gt; 应该只包含Strings 的约定。所以这就是你收到警告的原因;一般来说,混合原始类型和泛型类型是不好的做法。

【讨论】:

  • 他的警告可能来自使用原始类型。这有什么帮助?
  • @Shakedown:我正在展示该警告旨在帮助识别的问题类型。
【解决方案2】:

这取决于你所说的陷阱是什么意思。我会说不。泛型确保您的列表将只接受字符串。我认为这是一件好事。如果您需要一个列表来存储字符串以外的内容,那么这将不起作用。即使这样,我也会考虑是否可以创建一个接受所需值类型的自定义类,然后使用自定义类创建一个通用 List:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-27
    • 2013-05-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    相关资源
    最近更新 更多