2016-11-02 6 views
1

ジェネリックを使用するJavaでは、インタフェースAまたはBを実装するメソッド引数を指定できる方法はありますか?N個のインタフェースを実装するメソッド引数

public void foo(Object bar) // bar could either be an implementation of interface A or interface B but nothing else. 

private interface A<T> 
{ 
    Object work(final Fizz fizz, final T t); 
} 

private interface B 
{ 
    Object work(final Fizz fizz); 
} 
+0

は 'A'またはいずれかの方法で、相互に関連する 'B'です? – Makoto

+0

@Makoto AとBは論理的に関連していますが、BはAとほとんど同じですが、作業署名にはfizzオブジェクトしかありません。 –

+2

「仕事」の呼び出し側は、 'T'引数を渡すべきかどうかをどのように知っていますか? –

答えて

3

あり、一般的な意味での真の解決策はないのですが、あなたの特定の例のために、あなたのような何かを試みることができる:

public <T> void foo(A<T> bar) { 
    // ... 
} 

private interface A<T> { 
    Object work(final Fizz fizz, final T t); 
} 

private interface B extends A<Void> { 

    default Object work(final Fizz fizz) { 
     return work(fizz, null); 
    } 

    Object work(final Fizz fizz, final Void ignoreMe); 
} 
+2

' void foo(A bar)'のようなシグネチャは 'void foo(A bar)'よりも優れているわけではないことに注意してください。どちらの場合でも 'foo'の実装は実際のタイプの' T 'Awork'の第2引数に' null'以外の互換性のある引数を与えることはできません。 – Holger

1

いいえ、 ABの間に暗黙の関係はないので、と一致するメソッドの実装(および起動するシグネチャが異なる)を除いて、唯一の方法はメソッドをオーバーロードすることです。

public void foo(A<?> bar) { } 

public void foo(B bar) { } 
関連する問題