Java 在实例化泛型类时传递类型变量

Java 在实例化泛型类时传递类型变量,java,generics,Java,Generics,有人能解释一下ArrayList类的这两个实例化之间的区别吗 List<Integer> intList = new ArrayList(); List<Integer> intList = new ArrayList<Integer>(); List intList=new ArrayList(); List intList=new ArrayList(); 我知道编译器在编译成字节码时会删除类型变量,即Integer,而上面的例子两者的工作原理完全

有人能解释一下
ArrayList
类的这两个实例化之间的区别吗

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

我知道编译器在编译成字节码时会删除类型变量,即
Integer
,而上面的例子两者的工作原理完全相同。我想知道在右边传递类型变量(
Integer
)是否有任何好处,因为它已经在左边声明了?就我在网上所能找到的,他们都使用后者,但我看不出有任何理由我应该在两面声明两次。

他们是两个不同的东西。左侧是变量的类型。右侧是要创建的对象的类型。编译器将首先使用您在右侧提供的类型创建对象,然后将引用分配给左侧的变量

在您的例子中,没有区别,因为ArrayList在所有情况下都具有相同的构造函数。然而:

  • 在其他类中,构造函数的行为可能会根据您提供的特定类型而有所不同
  • 如果匹配类型,编译器将变得更容易。在第一个版本中,编译器必须将
    ArrayList
    类型的对象分配给需要
    List
    类型的变量。在某些情况下,您可能会收到警告,因为类型不完全匹配

您可能想要区别:

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

它们在运行时是相同的。但是编译时间有很大的不同。

没有类型参数的版本会导致警告,因为它可能不是类型安全的。在您的情况下,这不是一个问题,因为列表是空的,但通常是空的。比如说

List<String> stringList = new ArrayList<String>();
stringList.add("foo");
List<Integer> intList = new ArrayList(stringList); // Warning about unchecked conversion
int i = intList.get(0); // Oops, throws a ClassCastException
List-stringList=new-ArrayList();
字符串列表。添加(“foo”);
List intList=新阵列列表(stringList);//关于未经检查的转换的警告
inti=intList.get(0);//哦,抛出一个ClassCastException

因此,为了确保类型安全,最好通过在所有地方添加类型参数来消除警告。

有菱形操作符(
)ProjectCoin特性,我认为它在JDK7中,允许您编写
列表ints=new ArrayList()。确定类型的算法与一般方法的工作原理基本相同。我期待JDK7中的新特性。这是一个好的。