Próbowałem skondensować ten problem do najmniejszej możliwej ilości kodu.Problem z parametrami typu Java dla zwracanych wartości
Mam zdefiniowaną strukturę tabeli, podobnie jak tabelę bazy danych, z klasami i Table
poniżej. A Table
jest zasadniczo listą . Chcę, aby podklasy określały ich szczególny aromat Table
i i chcę, aby kompilator przechwytywał niewłaściwe próby umieszczenia wierszy jednego typu w tabelach niekompatybilnego typu.
Klasa abstrakcyjna Agent
zapewnia metodę pobierania parametrów i zwracania tabeli, która pobiera wiersze typu T
. Zdefiniowałem trzy metody ilustrujące problem, który mam.
W FinalAgent
, FinalTable
i FinalRow
zajęcia określić implementacje Agent
, Table
i klas. Ostatecznie, czego chcę, to method2a
, który pobiera listę parametrów i zwraca tabelę typu FinalTable
.
public abstract class Row {}
public abstract class Table<T extends Row> {}
public abstract class Agent {
public <T extends Row> Table<T> method1(List<String> parameter) {
return null;
}
public <T extends Row> Table<T> method2a(List<String> parameter) {
return null;
}
public <T extends Row> Table<T> method2b(String parameter) {
return null;
}
}
public class FinalRow extends Row {}
public class FinalTable extends Table<FinalRow> {}
public class FinalAgent extends Agent {
@Override
public <T extends Row> Table<T> method1(List<String> parameter) {
return null;
}
@Override
public FinalTable method2a(List<String> parameter) {
return null;
}
@Override
public FinalTable method2b(String parameter) {
return null;
}
}
Na dole:
method1
zFinalAgent
kompilacji, ale muszę napisaćTable<FinalRow> t1 = new FinalAgent().method1(null);
w celu wywołania metody.method2a
zFinalAgent
Zmieniłem typ zwracany doFinalTable
odzwierciedlać to, co ja rzeczywiście powrocie (Chcę napisaćFinalTable t2a = new FinalAgent().method2a(null);
), ale kompilator generuje błąd: Metoda method2a (Lista) typu FinalAgent musi zastąpić lub zaimplementować metoda supertypemethod3
Zmieniłem parametr zList
naString
. Metoda kompiluje OK, ale daje mi ostrzeżenie o typie bezpieczeństwa, z którym mogę przynajmniej pracować.
Więc wreszcie pytanie: czy jest to błąd kompilatora, który method2a
w FinalAgent
nie ma jeszcze method2b
skompilować skompilować?
Równie dobrze mogę zapytać, czy istnieje lepszy sposób na robienie tego, co robię?
@ElliottFrisch gdzie jest surowy typ? – shmosel
@ shmosel Mój błąd, przegapiłem typ ogólny w deklaracji 'FinalTable'. –
To jest osobliwa rozbieżność. – shmosel