2016-07-04 3 views
0

ジェネリックパラメータを持つジェネリックメソッドを取得しようとしていましたが、動作させることができません。ここで宣言は次のとおりです。ここでジェネリックメソッド宣言とジェネリックパラメータ

/** 
* Set items as table rows content 
* 
* @param rows - table row content 
*/ 
public abstract void setItems(List<?> rows); 

は実装です:

@Override 
public void setItems(List<Dto> bonuses) { 
    //code here 
} 

Dtoは、実際のクラスですが、コンパイラは、ISは親を見ていないことを言います。

型表のメソッドsetItems(リスト)が上書きまたは 私はジェネリック宣言で、別のパラメータとしてそれを定義していた場合は、スーパータイプのメソッド

を実装する必要があり、その後、コンパイラは私の新しいタイプの皮と言います既に定義されているクラス

この実装では、具体的なパラメータが必要であることをコンパイラに伝えることはできません。 ワイルドカードではなく型に変更しようとしましたが、同じ結果が得られます。これを具体的な実装(Dto)で動作させるにはどうすればよいですか?

+3

基本クラスのインタフェースが役に立たない場合は、それを変更したくない具体的な理由はありますか?基本クラス/インタフェースに型パラメータ "T"を入れるなどの方法があります。後でTがDtoだと言う? – GhostCat

+0

'Dto'が基本クラスであれば' public abstract void setItems(List <?extends Dto> rows); 'オーバーライドされたメソッドも同じように見えるようにメソッドを変更することもできます。 –

+0

Listのタイプ(リストまたはList )が実装され、それらが同じ親/基底クラスを持たないことがわかりません – Sarief

答えて

1

コメントにイエーガーマイスター@のようにそれを実行してくださいは言った:

public abstract class TestClass<T> { 
    public abstract void setItems(List<T> rows); 
} 

用途:

public class Test extends TestClass<Dto> { 

    @Override 
    public void setItems(List<Dto> rows) { 
     //TODO 
    } 
} 

それとも、

public abstract void setItems(List rows); 

としてあなたの方法を定義し、

のように使用することができます
public void setItems(List rows) {.... 

しかしそれは良い方法ではありません!

+0

の2番目の方法は、私がタイプキャスト、チェックが必要であり、誰が他に何を知っているのだろうから回避できません。 – Sarief

+0

最初の方法は回避策です。サンは明らかにドキュメントのようなものを使用しています。https://docs.oracle.com/javase/tutorial/extra/generics/methods.htmlしかし、実装しているメソッドには何がないのか分かりません。 – Sarief

+0

あなたのメソッドではコード ''を使用します。これはコード 'Dto'の親クラスではないので、コンパイラはエラーをスローします。もう1つの方法は、コード「」を使用して、すべてのクラスを使用できるようにすることです。しかし、反射なしでコード 'Dto'に限定することはできません。 – ageh

関連する問題