этот вопрос частично связан с моим последним вопросом .
У меня есть общий класс, представляющий коллекцию общих объектов:
public interface MyObject{}
public interface MyCollecion {
public foo(MyObject obj)
}
В моем дизайне эти коллекции объектов создаются клиентским классом (назовем его CollectionBuilder) с помощью подхода абстрактного класса:
public interface AbstractCollectionFactory {
public abstract MyCollection> createCollection(String collectionType);
}
Общие коллекции должны быть построен так:
public class CollectionBuilder{
AbstractCollectionFactory f;
public void buildDoubleCollection(){
MyCollection> c = f.createCell("MyType");
}
public void buildIntegerCollection(){...}
}
Хорошо. Так как здесь все в порядке. CollectionBuilder знает, какой универсальный конкретный тип нужно указать (в данном случае Double), и может правильно построить. Я могу скомпилировать это без предупреждения, и все должно работать нормально.
Теперь у меня есть вопрос, связанный как с дженериками, так и с дизайном моей программы.
В моем приложении есть еще один класс, которому нужно использовать коллекцию, созданную CollectionBuilder (назовем этот класс UserClass). UserClass:
MyCollection >
или MyCollection >
). В описанной ситуации плохая идея - не параметризовать универсальный класс MyCollection в UserClass?
public UserClass{
MyCollection a; //warning
MyCollection> b; //no warning
public method(MyObject o){ //warning
a.foo(b); //compile
}
public method2(MyObject> o){
b.foo(o); //error do not compile
}
}
Компилятор Java всегда протестует с предупреждением, если я не указываю общий параметр. В любом случае изнутри UserClass я не знаю конкретного параметра (и я бы не хотел его знать) и даже объявляю его с помощью "?" не позволяйте мне вызывать метод foo в MyCollection.
Итак, вопрос:
Я надеюсь, что все было ясно. Я борюсь с этой проблемой несколько дней, и я понятия не имею. Помогите, пожалуйста.