2011-12-06 10 views
3

Eclipseでコンパイル・エラーが発生するのはなぜですか?
エリアはインターフェースです。Java汎用テンプレート・エラー

public interface Shape { 
    ... 
    public Comparator<T extends Area> getComparator(); 
} 

はなく、私が代わりに使用している場合:

public interface Shape { 
    ... 
    public Comparator<? extends Area> getComparator(); 
} 
+0

'Comparator <? extends Area> 'はかなり役に立たない。あなたは何も比較するためにそれを使用することはできません – newacct

答えて

5

コンパイラがあるかを表すことになっているものTないアイデアを持っていないので。さて、あなたがインタフェース宣言としてpublic interface Shape<T>のようなものを持っていたら、おそらくそれを使って作業することができます。

+1

ああそう!しかし、私は一貫性を望まないが、コンパイラがインターフェイスを実装するクラスのためにあるべきであるという条件だけなら、<? Area>は問題ないはずですか?また、それは眉をひそめますか?使用していますか?ジェネリックで? –

+1

@CaptainJacksparrowは正しいですし、いいえ、ジェネリックで '? 'を使用すると何も問題ありません。 –

3

あなたが示したコードサンプルではTが定義されていません。

次は合法でなければなりません:

public interface Shape { 
    ... 
    public <T extends Area> Comparator<T> getComparator(); 
} 

か:

public interface Shape<T extends Area> { 
    ... 
    public Comparator<T> getComparator(); 
} 
2

第一の方法は、そのクラスがAreaクラスを拡張する場合は、パラメータに基づいてオブジェクトを返すために起こっています。

2番目のメソッドは、型を取得するためにパラメータを待つ必要はありません。

public interface Shape<T extends Area> 

またはメソッドをパラメータ:

public <T extends Area> Comparator<T> getComparator(); 

コンパイラはTが可能かを知る必要があり、Tのいずれか、動作する最初のものを得るインターフェイスでジェネリックを推測するために

は、パラメータまたは推​​論されたジェネリックの構造のいずれかの定義に基づいています。

関連する問題