У меня есть 3 интерфейса:Как создать экземпляр этого класса, параметризованного связным интерфейсом?
public interface IAggregable<TElement extends IAggregable<TElement, TResult>, TResult> {
TResult aggregate(TResult intermediateResult);
}
public interface IDeeplyCloneable<TElement extends IDeeplyCloneable<TElement>> {
TElement deepClone();
}
public interface IContainer<TElement extends IAggregable<TElement, TResult> & IDeeplyCloneable<TElement>, TResult> {
TResult aggregateAllElements();
TElement cloneElementAtIndex(int index);
}
Тогда есть два класса, которые реализуют эти 2 первые интерфейсы:
public class Person implements IAggregable<Person, Integer>, IDeeplyCloneable<Person> {
private int age;
public Integer aggregate(Integer intermediateResult) {
if (intermediateResult == null) {
return age;
}
return age + intermediateResult;
}
public Person deepClone() {
Person clone = new Person();
clone.age = age;
return clone;
}
@Override
public String toString() {
return "Person [age=" + age + "]";
}
}
и почти точно такой же
public class Car implements IAggregable<Car, Integer>, IDeeplyCloneable<Car> {
private int horsepower;
public Integer aggregate(Integer intermediateResult) {
if (intermediateResult == null) {
return horsepower;
}
return horsepower + intermediateResult;
}
public Car deepClone() {
Car clone = new Car();
clone.horsepower = horsepower;
return clone;
}
@Override
public String toString() {
return "Car [horsepower=" + horsepower + "]";
}
}
тогда, наконец, UselessContainer
, которые предполагают реализовать IContainer
и иметь возможность удерживать как Person
, так и Car
и любые другие объекты любого другого класса, которые реализуют IAggregable
и IDeeplyCloneable
.
public class UselessContainer<TElement extends IAggregable<TElement, TResult> & IDeeplyCloneable<TElement>, TResult> implements IContainer<TElement, TResult> {
private ArrayList<TElement> list;
public UselessContainer() {
this.list = new ArrayList<>();
}
public void add(TElement element) {
list.add(element);
}
@Override
public TResult aggregateAllElements() {
return null;
}
@Override
public TElement cloneElementAtIndex(int index) {
return null;
}
@Override
public String toString() {
return list.toString();
}
}
Вопрос: Как создать объект класса UselessContainer
?
Я пробовал: UselessContainer<? extends IAggregable<?, Integer> & IDeeplyCloneable<?>, Integer> container;
Попробуйте 'UselessContainer <Контент Person, Integer>;' или 'UnelessContainer container;'! Если вы хотите разместить разные классы в одном и том же контейнере, тогда ваш дизайн интерфейса неправильный. –
fabian
@fabian это то, что я не хочу, я хочу иметь возможность удерживать как автомобиль, так и человека в одном контейнере. –