я с трудом с созданием безопасного поведения типа, я буду использовать общий пример для того, чтобы подчеркнуть свой вопрос:Как вернуть реальный экземпляр из метода с общим типом возвращаемого
У меня есть интерфейс BoxCreator
, который определяется по формуле:
public interface BoxCreator{
public Box create(int id ,List<Box> others);
}
и общий Box
класс (а Box
может содержать несколько других Box
ES), который имеет такие методы, как int getId()
, Box getInternalBox(int id)
.
Предположим, у меня есть класс Shed implements BoxCreator,Container
(где контейнер - это просто общий интерфейс с действием, например, добавление и удаление). Я могу положить новые вещи в сарай, и он будет короблять их в ShedBox
, который реализует Box
.
До сих пор так хорошо, проблема возникает, когда я пытаюсь сделать какой-нибудь другой класс, который будет делать вещи немного по-другому, к примеру CoolShed extends Shed implements BoxCreator
, который положит вещь в CoolBox
эс (которые проходят ShedBox
).
На данный момент это работает, но у меня есть несколько подкладок в классе CoolShed
(от общего Box
до CoolBox
), который может быть «не красивым».
Что я ищу способ сделать
Shed<T extends ShedBox> implements BoxCreator<T>
А потом, когда implemeting в CoolShed
я бы просто сделать что-то вроде
CoolShed extends Shed<CoolBox> implemets BoxCreator<CoolBox>
Я пытался сделать разные классы родовыми, но не смог создать общий метод create
, потому что я не могу создать экземпляр T
или вернуть его на этот счет. Поэтому я немного потерялся.
Несколько нот:
CoolShed
использует много изShed
логики, но я бы просто, чтобы сделать его использоватьCoolBox
класс в качестве контейнера.- В настоящее время
Shed
имеет экземплярBoxCreator
, поэтому при созданииCoolShed
я просто делаюCoolShed
новым создателем, и он работает. CoolShed
будет иметь толькоCoolBox
экземпляров, но на самом деле я бы не прочь ничего простирающегосяShedBox
в классеShed
.
Я просто не мог найти хорошее объяснение того, как достичь желаемого поведения, и я не мог сказать, являются ли мои существующие роли О.К.
Я знаю, что мой пример довольно длинный, я был бы счастлив сделать его более ясным в любом случае.
EDIT
шаблон кода, чтобы сделать вопрос яснее:
public interface BoxCreator{
public Box create(int id ,List<Box> others);
}
public interface Box{
void put()
void addAnother(Box box);
}
public class ShedBox implements Box{
void put()
void addAnother(Box box);
}
public class CoolBox extends ShedBox{ //has some extra features but moslty the same
void put()
void addAnother(Box box);
}
public interface Container {
Box addValue(int value);
Box getBox(int id);
.
.
}
public class Shed implements Container, BoxCreator {
BoxCreator creator;
SomeCollection<Box> boxes;
Shed(){
creator = this;
.
.
.
}
Box addValue(int id){
.
.//some logic to get otherBox here
.
Box box = creator.createBox(id,otherBox);
}
Box getBox(int id);
public Box create(int id ,Box other){
return new ShedBox(id,others)
}
}
public class CoolShed extends Shed implements BoxCreator {
CoolShed(){
creator = this;
.
.
.
}
addValue(int id){
Box boxAdded = super.add(id)
.
.
.
CoolBox box = (CoolBox)boxAdded; // The questionable cast
.
. //Some logic that involves CoolBox specific actions
.
}
public Box create(int id ,Box other){
return new CoolBox(id,others)
}
}
Возможно, лучше включить образец кода с различными классами, чтобы показать, чего вы пытаетесь достичь ... –
Может ли CoolShed содержать CoolBox или может содержать любую коробку? –
@owlstead это много (доверять мне :)) кода, и большинство из них не имеет отношения к проблеме, поэтому я боюсь, что это только смутит людей еще больше, но я сделал несколько общих шаблонов, которые могли бы объяснить проблему лучше. – SadStudent