Java6:为什么要定义两次泛型?

Java6:为什么要定义两次泛型?,java,Java,当泛型在Java6中没有定义两次时,会发生什么“坏事情(tm)”呢 List foo=new ArrayList() 而不是 List foo=new ArrayList() 因为根据我的经验,两者都编译得很好,运行也很好 在Java7中,可以使用菱形操作符来完全避免这种情况 List foo=new ArrayList() 这更符合DRY原则。这只是一种语法,java在运行程序时对集合的泛型类型一无所知 所有关于泛型的提示/检查都是在编译时进行的。如果首先声明变量,如 List<Stri

当泛型在Java6中没有定义两次时,会发生什么“坏事情(tm)”呢

List foo=new ArrayList()

而不是

List foo=new ArrayList()

因为根据我的经验,两者都编译得很好,运行也很好

在Java7中,可以使用菱形操作符来完全避免这种情况

List foo=new ArrayList()


这更符合DRY原则。

这只是一种语法,java在运行程序时对集合的泛型类型一无所知

所有关于泛型的提示/检查都是在编译时进行的。如果首先声明变量,如

List<String> foo;
您将收到一条警告,因为编译器怀疑您忘记了
foo
的声明泛型类型。使用显式泛型类型进行初始化可以确保编译器记住所有信息


是的,它太冗长了,这就是为什么它在Java7中被替换为菱形操作符的原因。没有什么特别的。

干燥原则很重要,但也有一个原则“不要在项目中留下生成警告的代码”。即使你完全了解原因并知道它是完全无害的,消除警告也是一个好习惯

线路

List<String> foo = new ArrayList();
List foo=new ArrayList();
编译但生成编译器警告,除非使用@SuppressWarnings对其进行注释。一般来说,把它写成

List<String> foo = new ArrayList<String>();
List foo=new ArrayList();
和复制品一起生活。或者更好,升级到JDK7或更高版本

我如何衡量这两个原则的相对重要性取决于具体情况。扩展到代码不同部分或不同文件的干冲突很快就会变得无法容忍,但这里干冲突仅限于一行。打字时有一些讨厌的价值,但有警告似乎更讨厌,而且是一个不好的先例

当泛型没有在中定义两次时,会发生什么“坏事情”(tm) Java 6

在默认无参数构造函数的情况下可能没有什么不好的,就像ArrayList一样,但是如果有一个列表构造函数接受一个泛型参数,例如

class MyList<T> implements List<T>
{
  T firstValue;

  public MyList( T value )
  {
     firstValue = value;
  }
}

Apple apple = new Apple( );

// This compiles fine, and now we have a problem
// Hence the warning
MyList<Orange> foo = new MyList( apple );

// This does not compile
MyList<Orange> foo = new MyList<Apple>( apple );

// Nor this in Java 7
MyList<Orange> foo = new MyList<>( apple );
类MyList实现列表
{
T值;
公共MyList(T值)
{
第一个值=值;
}
}
苹果=新苹果();
//这编译得很好,现在我们遇到了一个问题
//因此发出警告
MyList foo=新MyList(苹果);
//这是不可编译的
MyList foo=新MyList(苹果);
//在Java7中也不是这样
MyList foo=新MyList(苹果);
class MyList<T> implements List<T>
{
  T firstValue;

  public MyList( T value )
  {
     firstValue = value;
  }
}

Apple apple = new Apple( );

// This compiles fine, and now we have a problem
// Hence the warning
MyList<Orange> foo = new MyList( apple );

// This does not compile
MyList<Orange> foo = new MyList<Apple>( apple );

// Nor this in Java 7
MyList<Orange> foo = new MyList<>( apple );