Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java6中使用右边的泛型?_Java_Generics_Diamond Operator - Fatal编程技术网

在Java6中使用右边的泛型?

在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

我可以如下声明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 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));