在Java6中使用右边的泛型?
我可以如下声明arraylist 方法1:在右侧也使用泛型,即在Java6中使用右边的泛型?,java,generics,diamond-operator,Java,Generics,Diamond Operator,我可以如下声明arraylist 方法1:在右侧也使用泛型,即 List<Integer> p = new ArrayList<Integer>(); List p=new ArrayList(); 方法2:使用菱形操作符 List<Integer> p = new ArrayList<>(); List p=new ArrayList(); 方式3:仅在左侧使用通用 List<Integer> p = new ArrayLis
List<Integer> p = new ArrayList<Integer>();
List p=new ArrayList();
方法2:使用菱形操作符
List<Integer> p = new ArrayList<>();
List p=new ArrayList();
方式3:仅在左侧使用通用
List<Integer> p = new ArrayList();
List p=new ArrayList();
我更喜欢使用方式3作为它的简要说明。这些方法有什么区别吗?我们应该选择哪一个?为什么
更新:-我知道在java 7中建议使用第二种方式,但我的问题是在java 6的上下文中。哪一个更好
对我来说,方法3也说p是整数的数组列表(方法1也表达了这一点)。因此,我发现除了IDE显示警告消息外,没有其他区别: ArrayList是原始类型。对泛型类型
ArrayList
的引用应参数化
没有区别,如果您使用的是Java7,那么您更喜欢第二种方法,但它在Java6中不可用。这是java 7的一种选择。两者都相同,但可从java 7获得。第二种方法在java 6中不可能实现。这是在Java 7中推断泛型实例的新方法。两者都是相同的。但两者都有版本差异 但第二种方法在Java6中是不可能的。在Java7中,若我们不在右侧声明类型,那个么默认情况下它将采用和左侧相同的类型
因此,根据您的更新,如果您必须使用Java6,那么您应该使用way1。正如已经指出的,Way2在1.6中无效。所以问题是,方法1和方法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);
}
}
我们可以看到,在这两种情况下产生的字节码完全相同。请注意,由于泛型没有在编译时烘焙,编译器在编译时检查信息后会丢弃这些信息,并添加
checkcast
指令,以确保检索对象时执行的强制转换是安全的。方式3使用原始类型。永远不要使用原始类型。它们只能在旧代码中使用。方式3不好。混合使用泛型和原始类型是不明智的,因为您正在对运行时的类型进行假设,并且可能会遇到类似以下代码的ClassCastException:
ArrayList b = new ArrayList();
b.add(5);
ArrayList<String> a = new ArrayList(b);
System.out.println(a.get(0));
ArrayList b=新的ArrayList();
b、 增加(5);
ArrayList a=新的ArrayList(b);
System.out.println(a.get(0));
因此,对于Java 6,请始终使用way 1注意,[diamond operator]标记中的信息已经回答了您的问题。将鼠标悬停在这个标记上,阅读它描述的第一句话:diamond操作符()是在JavaSE7中引入的,实际上我指的是右边的泛型。查看我的更新自Java 7关于菱形运算符以来,这其中的哪一部分可用,您仍然不了解?这就像在Java 1.4或更早版本中使用泛型一样:它不存在,所以你不能在那里使用它。在用Way2编辑之后,现在你正在用一个没有意义的原始
ArrayList
初始化一个List
,这就是我试图理解的区别,顺便说一句,List p=new ArrayList()和List p=new ArrayList()。您说过“在以Way2进行编辑之后,现在您正在使用一个没有意义的原始ArrayList初始化一个列表…”。为什么在Java6中允许使用方式2没有任何意义。我知道在Java7中建议使用发送方式。但我的问题是在Java6的上下文中。哪一个更可取?查看我的更新。对我来说,方式3还说p是整数的数组列表(与方式1相同)。所以我发现除了IDE显示关于原始类型的警告消息之外,没有什么不同。同样,对于方式3,我们不能在arraylist p中添加字符串。因此,我不理解“Way 3使用原始类型”的语句。当我清楚地将其声明为intgers的arraylist时。如果Way 1和Way 3完全相同,为什么会在Way 3中抛出警告“arraylist是原始类型。对泛型类型arraylist的引用应该参数化”,而不是在Way 1中抛出?警告对我来说没有任何意义。是吗?警告是由编译器给出的,因为它认为它没有所有的信息。与其他编程语言不同,Java中没有类型推断。但是,您已经提供了足够的信息来生成相同的代码,因为左侧的泛型类型告诉编译器引入checkcast
。Way1和way3可以编译为相同的字节码(谢谢键入擦除!),但在编译过程中它们并不相同。java中的所有泛型类型信息都是如此:类型只提供编译时类型检查。有关方式1和方式3的区别的更多信息,请参见
ArrayList b = new ArrayList();
b.add(5);
ArrayList<String> a = new ArrayList(b);
System.out.println(a.get(0));