Это врожденная проблема с Java-дженериками. Поскольку общие типы стираются во время выполнения, jvm не может решить, какую версию метода getArrayOfTimespan()
вызывать, так как оба будут иметь одну и ту же подпись: то есть getArrayOfTimespan(List<Object> arg1)
. Отсюда и ваша ошибка. Однако, если мы выходим за пределы общих возможностей Java, это ограничено, компилятор Java фактически говорит вам, что у вас есть более глубокая проблема.
Кажется, что обе ваши Student
и Developer
классы разделяют поведение в какой-то степени, так как оба имеют одинаково названный метод, который делает то же самое: getStartDate()
. Это предполагает, что вы можете объявить интерфейс, который определяет это обычное поведение, например. «Начать», а затем вам нужно будет только определить метод getArrayOfTimespan()
для интерфейса.
interface Startable {
LocalDate getStartDate();
}
class Student implements Startable { /* ... */ }
class Student implements Startable { /* ... */ }
class hierarchyValidator {
private LocalDate[][] getArrayOfTimespan(List<Startable> startables)
{
// ...
LocalDate startDate = startable.getStartDate();
// ...
}
}
Продолжая на этом пути вы, вероятно, заметите, что вы делаете некоторые копирования-вставки между вашими Developer
и Student
классов, как я предполагаю, что они не только разделяют общее поведение, но и общая структура (не менее private LocalDate startDate;
). Это всегда является показателем того, что вы должны извлекать свою общую структуру и поведение в абстрактный класс. Например:
abstract class Person {
private LocalDate startDate;
public LocalDate getStartDate() {
return this.startDate;
}
// ... etc ...
}
class Student extends Person{}
class Developer extends Person{}
class hierarchyValidator {
private LocalDate[][] getArrayOfTimespan(List<Person> people)
{
// ...
LocalDate startDate = person.getStartDate();
// ...
}
}
Это не только сэкономит вам много копирования вставки, но это будет также сделать код более ясным для других, и поможет вам избежать ошибок, когда вы меняете вещи в одном месте и забыть о копии.
Итак, вкратце: если вы понимаете, что вы заняты копированием, или если у вас проблемы с генериками, это почти всегда означает, что вам нужно наследование. Если ваши классы имеют общее поведение (т. Е. Имеют одинаковые методы) -> используйте интерфейс. Если ваши классы имеют общую структуру (т. Е. Имеют одинаковые поля) -> используйте абстрактный класс.
Надеюсь, что это поможет, и удачи!
Вы используете Java 8? – WalterM
Я использую версию java 6 –
@WalterM oh, тогда время Joda. Scratch мой предыдущий комментарий :) – Mena