этот вопрос частично связан с моим последним вопросом .
У меня есть универсальный класс, представляющий коллекцию универсальных объектов:
public interface MyObject<N extends Number>{}
public interface MyCollecion<N extends Number> {
public foo(MyObject<N> obj)
}
В моем дизайне эти коллекции объектов создаются клиентским классом (назовем его CollectionBuilder) с помощью подхода абстрактного класса:
public interface AbstractCollectionFactory {
public abstract <N extends Number> MyCollection<MyObject<N>> createCollection(String collectionType);
}
Общие коллекции должны быть построены следующим образом:
public class CollectionBuilder{
AbstractCollectionFactory f;
public void buildDoubleCollection(){
MyCollection<MyObject<Double>> c = f.<Double>createCell("MyType");
}
public void buildIntegerCollection(){...}
}
Хорошо. Так как здесь все хорошо. CollectionBuilder знает, какой тип конкретного бетона нужно указать (в данном случае Double), и может построить правильно. Я могу скомпилировать это без предупреждения, и все должно работать нормально.
Теперь у меня есть вопрос, связанный как с дженериками, так и с дизайном моей программы.
У меня есть другой класс в моем приложении, которому нужно использовать коллекцию, созданную CollectionBuilder (давайте назовем этот класс UserClass).
Класс пользователя:
- Не нужно знать, к какому конкретному типу бетона относится его коллекция (
MyCollection<MyObject<Double>>
или MyCollection<MyObject<Integer>>
).
- выполняет некоторые операции с этими коллекциями, вызывая некоторые методы, определенные в интерфейсе MyCollection.
- Я бы не хотел добавлять к нему универсальный тип.
В описанной ситуации плохая идея не параметризует универсальный класс MyCollection insied 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.
Так вот вопрос:
- не параметризация ссылки на универсальный тип - это всегда плохо?
- если ответ на 1 - НЕТ, это правильная ситуация, если вы этого не делаете?
- если ответом на 1 является ДА, как я могу использовать метод MyCollection внутри UserClass, не зная их универсальных типов?
- Мой плохой дизайн?
Я надеюсь, что было ясно. Я боролся с этой проблемой с незапамятных времен и понятия не имею. Пожалуйста, помогите мне.