0

ジェネリック クラスは、次のsscceのように、そのコンストラクターで一致するジェネリック オブジェクトを必要とする場合があります。

import java.util.ArrayList;
import java.util.List;

public class GenericsIssue<K> {
  public List<K> inner; 

  public GenericsIssue(List<K> input) {
    if(input == null) throw new NullPointerException();
    this.inner = input;
  }

  public K getFirst() {
    if(inner.isEmpty()) return null;
    return inner.get(0);
  }
  // Snip, code continues below

また、ファクトリ メソッドは、その引数でジェネリック型を指定しません。たとえば、これを行う場合があります。「チェックされていないキャスト」でさえ、警告はありません。

  // Code borrowed from Guava source
  public static <E> ArrayList<E> newArrayList() {
    return new ArrayList<E>();
  }
  // End Guava borrow      

  public static void main(String... args) {
    ArrayList<String> list = newArrayList();
    GenericsIssue<String> gi = new GenericsIssue<String>(list);
    System.out.println(gi.getFirst()); // (Always null. Not relevant.)
  }
}

ただし、これmainはほぼ同じことですが、Eclipse でもコマンドラインでも、JDK 7u25 ではコンパイルされません。なんで?

  public static void main(String... args) {
    GenericsIssue<String> gi = new GenericsIssue<String>(newArrayList());
    System.out.println(gi.getFirst());
  }

コンパイラエラーは次のとおりです。

$ javac -d . -Xlint:unchecked GenericsIssue.java
GenericsIssue.java:23: error: constructor GenericsIssue in class GenericsIssue<K> cannot be applied to given types;
        GenericsIssue<String> gi = new GenericsIssue<String>(newArrayList());
                               ^
  required: List<String>
  found: ArrayList<Object>
  reason: actual argument ArrayList<Object> cannot be converted to List<String> by method invocation conversion
  where K is a type-variable:
    K extends Object declared in class GenericsIssue
1 error
4

1 に答える 1

3

ジェネリック システムは、それが行うことができる推論に制限があり、代入はメソッド パラメーターとは異なる方法で処理されます。指定できるはずです

new GenericsIssue<String>(GenericsIssue.<String>newArrayList());

(理論的には、その推論は可能であるはずですが、そのレベルの分析はまだ実装されていません。)

于 2013-09-08T19:20:17.710 に答える