2012-04-24 17 views
8

Mam ten kod:metoda java powrocie instancję klasy <T rozciąga somethng>

public <T extends Scrapper> Class<T> getScrapper() { 
    return MyScrapper.class; 
} 

MyScrapper jest klasa wykonawczych Scrapper interfejs. Dlaczego to nie działa? Otrzymuję następujący błąd w JDK7:

error: incompatible types 
required: Class<T> 
found: Class<MyScrapper> 
where T is a type-variable: 
T extends Scrapper declared in method <T>getScrapper() 

P.S. Szczerze próbowałem szukać całych 30-40 minut.

Aktualizacja: jeśli zgłoszę metodę jako public Class<? extends Scrapper> getScrapper() { to działa. ale nadal nie rozumiem, dlaczego oryginalna deklaracja się nie kompilowała. co jest z tym nie tak?

+0

Co się stanie, jeśli po prostu ustawisz na ControlAltDel

+0

tak jak sugerujesz, to nie powinno działać. ale spróbowałem czegoś innego i zadziałało. Zaktualizowałem pytanie: –

+0

Tak, jestem zmęczony. Chodziło mi o zmianę tylko na Scrappera (nierównomiernie), ale masz go do pracy używając argumentów klasowych i jeśli to pasuje do twoich celów na – ControlAltDel

Odpowiedz

10

z ogólnej metody jak getScrapper() The rozmówca metody określa co rzeczywisty typ argumentu metody jest (T w tym przypadku). Osoba dzwoniąca może wybrać dowolny podtyp Scrapper jako T, a twoja metoda (która zawsze zwraca MyScrapper.class) nie zwróci poprawnej klasy.

względu na podpis metody, dzwoniący tej metody byłoby oczekiwać, aby być w stanie to zrobić:

Class<MyOtherScrapper> c = foo.<MyOtherScrapper>getScrapper(); 

Zmiana sposobu powrotu Class<? extends Scrapper> sprawia, że ​​nie jest już metoda rodzajowa ... istnieją brak parametrów typu dla osoby dzwoniącej do ustawienia. Zamiast tego sygnatura mówi, że metoda zwraca obiekt klasy dla jakiegoś nieznanego podtypu z Scrapper i MyScrapper.class, który pasuje do rachunku za to.

+0

Dziękuję :) Wygląda na to, że byłem zmęczony i głupi wczoraj, gdy zadałem to pytanie: D Powinienem to ja :) –

Powiązane problemy