gpt4 book ai didi

java - 自 Java5 + 菱形运算符以来初始化通用集合的方法

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:15:36 24 4
gpt4 key购买 nike

据我所知,泛型仅在编译时有用。

因此可以声明:

private Set set = new HashSet<String>();

然后,在这个字符串哈希集中,向该集合添加狗或任何东西,没有任何问题,因为在运行时没有像数组那样的任何检查(ArrayStoreException ...)(但你可能会遇到类似类广播的问题你用那套...

所以我想说的是,我们通常会这样实例化泛型集合:

Set<String> set = new HashSet<String>();

我的问题是,为什么我们要放置 HashSet 的类型,因为只有变量引用的类型才是真正重要的(我认为)。

我的意思是,我们可以简单地写:

Set<String> set = new HashSet();

它的工作原理完全一样,对吗?那么为什么我们通常在实例化时写类型呢? (这不是强制性的)


编辑

我知道用于类型推断的“钻石运算符”,但为什么我们甚至需要它!!!因为类型推断已经开始工作了!

以下代码:

            Set<String> set = new HashSet();
set.add("Test add a string 1");
set.add("Test add a string 2");
for ( String s : set ) {
System.out.println(s);
}

产生输出:

Test add a string 1 Test add a string 2

自己测试 http://ideone.com/vuiCE

所以现在您将类型推断作为 Java7 功能来谈论,但它已经对我有用了...

使用 java7 我将不得不更换我的

            Set<String> set = new HashSet();

通过

            Set<String> set = new HashSet<>();

做完全相同的事情仍然需要 2 个额外的字符,不是吗? (除非泛型不仅仅是Java7的编译时间?我不知道)

最佳答案

And it would work exactly the same right?

在运行时:

在编译时:

您的代码会将包含任意对象的集合分配给存储包含字符串的集合的变量,这是不好的,并且会被类型检查器拒绝.

当你写 new HashSet()你正在使用 raw type .我提到这个问题是关于它的含义,以及为什么应该避免它:


一般来说,你可以这样争论:

Set<String> set = new HashSet();

不远

HashSet tmp = new HashSet();
...
Set<String> set = tmp;

反过来不远

HashSet tmp = new HashSet();
tmp.add(7);
...
Set<String> set = tmp;

它仍然可以编译,但是由于一千个原因而变得糟糕 :)


Java 7 允许你写

Set<String> set = new HashSet<>();

不过,它告诉编译器推断 < 之间的类型... > .

关于“钻石运算符”的文档:

关于java - 自 Java5 + 菱形运算符以来初始化通用集合的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8010344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com