Я отправлю свой вопрос внизу.Как создать правильный тип возврата?
Ниже приведен класс, из которого распространяются другие классы.
public class people {
class family extends people {
}
class friends extends people {
}
class coworkers extends people {
}
}
Ниже класс, который имеет метод getAllPeopleByClass, который получает вызывается getMembers() метод в классах выбора:
public class processing {
static processing process = null;
private Collection<family> familyList = new ArrayList<family>();
private Collection<coworkers> cowList = new ArrayList<coworkers>();
private Collection<friends> friendList = new ArrayList<friends>();
public processing(){
}
public static processing getInstance() {
if (process == null)
process = new processing();
return process;
}
public <T> Collection<people> getAllPeopleByClass(Class<T> clazz) {
Collection<people> peopleCollection;
peopleCollection.addAll(getList(clazz));
return peopleCollection;
}
private <T> Collection<? extends people> getList(Class<T> clazz) {
if (clazz == family.class) {
return familyList;
} else if (clazz == coworkers.class) {
return cowList;
} else { // else if clazz == friends.class
return friendList;
}
}
И, наконец, классы, которые используют обработку:
public class familySelection {
public Collection<family> getMembers() {
Collection<family> f;
f = processing.getInstance().getAllPeopleByClass(family.class); //type mismatch
return f;
}
}
public class coworkerSelection {
public Collection<coworkers> getMembers() {
Collection<coworkers> c;
c = processing.getInstance().getAllPeopleByClass(coworkers.class); //type mismatch
return c;
}
}
public class friendsSelection {
public Collection<friends> getMembers() {
Collection<friends> f;
f = processing.getInstance().getAllPeopleByClass(friends.class); //type mismatch
return f;
}
}
Моя проблема в том, что я получаю несоответствие типов от вызова getAllPeopleByClass в каждом из моих методов getMembers().
Я попытался это:
public class familySelection {
public Collection<family> getMembers() {
Collection<? extends people> f; //changed to extend from people
f = processing.getInstance().getAllPeopleByClass(family.class);
return (Collection<family>) f; //cast warning - dont want that
}
}
Это работает, но я получаю предупреждение произнесения, что я не хочу, и я не хочу, чтобы подавить его. Это самое близкое, что я придумал для решения проблемы. Кроме того, возвращаемый тип getMembers() должен оставаться как есть. У кого-нибудь есть способ сделать это без каких-либо предупреждений? Или даже как-то справиться с этим в целом? Благодаря!
Основная проблема в вашем дизайне является то, что генерик для компиляции исполнения типа времени, но вы выполняете проверку типа во время выполнения. Возможно, рассмотрим наличие 3 отдельных методов для возврата каждого типа коллекции. – nitegazer2003