Java 6:为什么定义泛型两次?

Gre*_*lls 4 java

在Java 6中未定义两次泛型时会发生什么"坏事(tm)"?

List<String> foo = new ArrayList();

代替

List<String> foo = new ArrayList<String>();

因为根据我的经验,两者都编译得很好,并且运行良好.

在Java 7中,可以使用菱形运算符来完全避免这种情况.

List<String> foo = new ArrayList<>();

这更符合DRY原则.

Ale*_*yak 8

在Java 6中未定义两次泛型时会发生什么"坏事(tm)"?

在默认的no-args构造函数的情况下可能没什么不好的,就像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 );
Run Code Online (Sandbox Code Playgroud)


Nat*_*hes 6

DRY原则很重要,但也有一个原则:"不要在项目中留下产生警告的代码".即使你完全了解原因并且知道它完全无害,消除警告也是一个好习惯.

这条线

List<String> foo = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

编译但生成编译器警告,除非您使用@SuppressWarnings进行注释.一般来说,写它的麻烦就少了

List<String> foo = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

并与重复生活在一起.或者更好,升级到JDK7或更高版本.

我如何衡量这两个原则的相对重要性取决于具体情况.延伸到代码的不同部分或不同文件的DRY违规很快就会无法容忍,但这里DRY违规仅限于一行.打字时有一些令人讨厌的价值,但有警告似乎是一个更大的麻烦,并设置一个不好的先例.