Я пытался сконденсировать эту проблему до наименьшего количества кода, который мог бы.Проблема с параметрами типа Java для возвращаемых значений
Я определил структуру таблицы, как таблицу базы данных, с нижеприведенными ниже классами и Table
. A Table
по существу является списком . Я хочу, чтобы подклассы определяли их особый вкус Table
и , и я хочу, чтобы компилятор поймал неуместные попытки поместить строки одного типа в таблицы несовместимого типа.
Класс Agent
предоставляет метод для ввода параметров и возвращает таблицу, которая принимает строки типа T
. Для иллюстрации проблемы, которую я имею, я определил три метода.
В FinalAgent
, FinalTable
и FinalRow
классов определяют реализации Agent
, Table
и классов. В конечном счете, я хочу, чтобы method2a
, который принимает список параметров и возвращает таблицу типа 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;
}
}
В нижней части:
method1
изFinalAgent
компилируется, но я должен написатьTable<FinalRow> t1 = new FinalAgent().method1(null);
для того, чтобы вызвать метод.method2a
изFinalAgent
я изменил тип возврата кFinalTable
, чтобы отразить то, что я на самом деле возвращения (Я хочу написатьFinalTable t2a = new FinalAgent().method2a(null);
), но компилятор выдает ошибку: Метод method2a (Список) типа FinalAgent необходимо переопределить или реализовать супертипmethod3
Я изменил параметр отList
доString
. Метод компилируется нормально, но дает мне предупреждение о безопасности типа, с которым я, по крайней мере, могу работать.
Итак, наконец, вопрос: Является ли это ошибка компилятора, который method2a
в FinalAgent
ещё method2b
не компилируется компилируется?
Я мог бы также спросить, есть ли лучший способ сделать то, что я делаю?
@ElliottFrisch Где сырье типа? – shmosel
@shmosel Моя ошибка, я пропустил общий тип в объявлении 'FinalTable'. –
Это любопытное несоответствие. – shmosel