なんでそうなの?
static final class Entry<K,V> implements Map.Entry<K,V>
なぜ好きではないのですか?
static final class Entry implements Map.Entry<K,V>
なんでそうなの?
static final class Entry<K,V> implements Map.Entry<K,V>
なぜ好きではないのですか?
static final class Entry implements Map.Entry<K,V>
Entryが外部マップパラメータを使用できない理由を理解するための鍵は、static
それを宣言するために使用されるキーワードにあります。
K、Vの実際のタイプは、外部Mapのインスタンスにのみ認識されますが、EntryはMapクラスのみに認識されます。したがって、Entryは、独自のジェネリックパラメーターを持つジェネリック型である必要があります。外側のクラス(マップ)のようにK、Vという名前が付けられていることを気にしないでください。これらは、さまざまなパラメーターを識別します。
しかし、Entryクラスは、トップクラスのTreeMapからタイプKとVをすでに認識しています。そしてそれはまだ安全にタイプされます。EntryはTreeMapKとVを知っているようですが、独自のパラメータタイプを作成します
実際のところ、そうではありません。
public class Main<T> {
static final class Entry {
T t; // ERROR: Cannot make a static reference to the non-static type T
void f(T t) {} // ERROR: Cannot make a static reference to the non-static type T
}
}
一方、以下はエラーなしでコンパイルされます。
public class Main<T> {
static final class Entry<T> {
T t;
void f(T t) {}
}
}
static final class Entry implements Map.Entry<K,V>
エントリインターフェイスはパラメータ化されており、周囲の要素からのパラメータ化された型の自動推論はサポートされていないため、これはJavaでは有効なステートメントではありません。Java 7は、ダイヤモンド演算子の導入により、この方向に正しい一歩を踏み出しました。ただし、JLSがインターフェイス自体からタイプを推測するように定義するまで待つ必要があります。