2016-04-08 5 views
1

私は2つのクラスジェネリッククラス

class Key<T extends Comparable<T>> {// used for composite key for HashMap 
private T q; 
private T o; 
@Override 
public boolean equals(Object obj) { 
    ... 
} 

@Override 
public int hashCode() { 
    .... 
} 
} 

class A<Key,V, T> { 
private LinkedHashMap<Key,V> map; 
public A() { 
    ... suppose we instance map and assign some example values for it here. 
} 
public foo (T q, T o) { 
    //From two element q and o, I want to instance a object Key k 
    //to check whether this key k is exist in the Map or not by using 
    //map.get(key). 
    Key k = new Key(q,o); 
} 
} 

を持っているしかし、私はこのエラーが行Key k = new Key(q,o)で「Key型をインスタンス化できません」ですか?

なぜこのエラーが発生し、どのように解決できますか?

答えて

3

Keyは、クラスAの型変数として宣言されています。

class A<Key, V, T> { ... 
     ^Everything between <> are type variables 

これは、あなたがnew Keyを書くとき、あなたは「いくつかの」クラス、必ずしもあなたのKeyクラスのインスタンスを作成しようとしていることを意味します。型の消去のため、実際の型は実行時に認識されません。あなたはまた、生タイプを使用すべきではない

class A<V, T> { ... 

注:

private LinkedHashMap<Key<T>,V> map; 

Key<T> k = new Key<>(q, o); 
を単純型変数の宣言を削除し、あなたはここに掲載され、あなたの Keyクラスを参照することを意味と仮定すると、

さらに、Keyの制約に準拠するには、をバインドする必要があります。つまり、同等でなければなりません。

class A<V, T extends Comparable<T>> { ... 
関連する問題