2011-01-05 10 views
5

Chcę utworzyć interfejs, który pozwala każdej klasy realizacja tak:wejściowy interfejs Java argumentem rozciąga się od klasy bazowej

public interface MyInterface 
{ 

    void doSomething(<A extends MyBaseClass> arg1); 
} 

public class MyImpl implements MyInterface 
{ 
    void doSomething (SomeClassExtendsMyBaseClass arg1) 
    { 
    // do something 
    // SomeClassExtendsMyBaseClass is a class that extends MyBaseClass 
    } 
} 

pojawia się błąd składni podczas wykonywania powyższych. Czy ktoś może mi pokazać, jak osiągnąć ten cel?

Dzięki

Odpowiedz

16
public interface MyInterface<A extends MyBaseClass> 
{ 

    void doSomething(A arg1); 
} 

public class MyImpl implements MyInterface<SomeClassExtendsMyBaseClass> 
{ 
    public void doSomething (SomeClassExtendsMyBaseClass arg1) 
    { 
    // do something 
    // SomeClassExtendsMyBaseClass is a class that extends MyBaseClass 
    } 
} 
2

powinno być

<T extends MyBaseClass> void doSomething(T arg1); 
+0

+1 - Jest to najlepsze rozwiązanie, jeśli rodzaj ogólny jest ściśle ograniczony do jednej metody. – Jeremy

+0

Nie ma sensu, aby metoda przyjmowała argument typu "T rozszerza MyBaseClass", chyba że musisz zrobić coś innego z 'T', np. Zwrócić obiekt typu' T' lub ograniczyć inny parametr przy użyciu tego typu . W takim przypadku bardziej odpowiednie byłoby "void doSomething (MyBaseClass arg1)". Dodatkowo OP wyraźnie chce implementacji swojego interfejsu, aby móc ograniczyć typ 'MyBaseClass' akceptowanej przez metodę; Ogólne metody pozwalają _caller_ na określenie typu. – ColinD

+0

@Colin: "chyba że musisz coś zrobić z' T' "- czy nie tego chce OP? – Jeremy

8

@salexander ma rozwiązanie, ale powodem trzeba to zrobić jest to, że klasa pochodna stara się być bardziej szczegółowe, które nie mogą zrobić. Powód tego jest następujący.

MyInterface mi = new MyImpl(); 
mi.doSomething(new MyOtherClassWhichExtendsMyBaseClass()); 

W interfejsie mówiłeś można podjąć wszelkie MyBaseClass, więc trzeba szanować to.

W rozwiązaniu @ salexander kod będzie wyglądał.

MyInterface<SomeClassExtendsMyBaseClass> mi = new MyImpl(); 
mi.doSomething(new MyOtherClassWhichExtendsMyBaseClass()); // compile error. 
+1

+1 dla wyjaśnienia. – jaydel

Powiązane problemy