gpt4 book ai didi

java - 在 Java 6 的右侧使用泛型?

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

我是 java 6 我可以如下声明数组列表

方式 1:使用泛型,即 <Integer>也在右手边

List<Integer> p = new ArrayList<Integer>();

方式二:使用菱形算子

List<Integer> p = new ArrayList<>();

方式三:仅在左侧使用泛型

List<Integer> p = new ArrayList(); 

我更喜欢使用方法 3 作为它的简要说明。这些方式有什么区别吗?我们应该更喜欢哪一个?为什么?

更新:-我知道在 java 7 中推荐第二种方式,但我的问题是在 java 6 的上下文中。哪种方式更可取?

对我来说,方法 3 还说 p 是一个整数数组列表(与方法 1 表达的相同)。因此,除了 IDE 显示警告消息外,我没有发现任何区别:

ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized

最佳答案

如前所述,方式 2 在 1.6 中无效。那么问题来了,Way 1 和 Way 3 有什么不同吗?除了可读性,没有。

拿这段代码:

import java.util.*;
class G {
public static void main(String [] args){
List<Integer> listOne = new ArrayList<Integer>();
listOne.add(1);
int one = listOne.get(0);

List<Integer> listTwo = new ArrayList();
listTwo.add(1);
int two = listTwo.get(0);
}
}

编译它并使用javap -c查看字节码

  public static void main(java.lang.String[]);
Code:
// FOR listOne
0: new #2 // class java/util/ArrayList
3: dup
4: invokespecial #3 // Method java/util/ArrayList."<init>":()V
7: astore_1
8: aload_1
9: iconst_1
10: invokestatic #4 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
13: invokeinterface #5, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
18: pop
19: aload_1
20: iconst_0
21: invokeinterface #6, 2 // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
26: checkcast #7 // class java/lang/Integer
29: invokevirtual #8 // Method java/lang/Integer.intValue:()I
32: istore_2
// FOR listTwo
33: new #2 // class java/util/ArrayList
36: dup
37: invokespecial #3 // Method java/util/ArrayList."<init>":()V
40: astore_3
41: aload_3
42: iconst_1
43: invokestatic #4 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
46: invokeinterface #5, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
51: pop
52: aload_3
53: iconst_0
54: invokeinterface #6, 2 // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
59: checkcast #7 // class java/lang/Integer
62: invokevirtual #8 // Method java/lang/Integer.intValue:()I
65: istore 4
67: return
}

我们可以看到在这两种情况下生成的字节码完全相同。请注意,由于未在编译器中烘焙泛型,因此在编译时检查信息后会丢弃该信息,并添加 checkcast 指令以确保它在检索对象时执行的强制转换是安全的。

关于java - 在 Java 6 的右侧使用泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17357883/

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