2016-11-02 1 views
1

Gibt es eine Möglichkeit in Java Generics zu verwenden, die es mir ermöglichen, ein Methodenargument anzugeben, das entweder die Schnittstelle A OR B implementiert?Methodenargument, das eine Implementierung von N Schnittstellen sein könnte

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

Sind 'A' oder 'B' miteinander in irgendeiner Weise mit ? – Makoto

+0

@Makoto A und B sind logisch verwandt, da B ziemlich genau dasselbe ist wie A, außer dass es nur ein Fizz-Objekt in seiner Arbeitssignatur enthält. –

+2

Wie weiß der Aufrufer von 'work', ob er ein' T'-Argument übergeben soll? –

Antwort

3

Es gibt keine wirkliche Lösung im allgemeinen Sinne, sondern auch für Ihr spezielles Beispiel könnten Sie versuchen, so etwas wie:

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

Beachten Sie, dass eine Signatur wie ' void foo (A bar)' nicht besser ist als 'void foo (A bar)', in beiden Fällen hat die Implementierung von 'foo' keine Vorstellung vom tatsächlichen Typ von' T 'und kann dem zweiten Parameter von'A.work' kein anderes Argument als" null "liefern. – Holger

1

Nein; Da es keine implizite Beziehung zwischen A und B mit Ausnahme der zufälligen Implementierung einer work Methode (und mit verschiedenen Signaturen zu booten) gibt, ist Ihr einziger Ansatz, die Methode zu überlasten.

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

public void foo(B bar) { } 
Verwandte Themen