Дженерики Java и шаблоны проектирования: не параметризация ссылки на универсальный тип всегда плохо?

этот вопрос частично связан с моим последним вопросом .

У меня есть общий класс, представляющий коллекцию общих объектов:

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:

  1. Не нужно знать, какой конкретный тип является его коллекцией ( MyCollection > или MyCollection > ).
  2. выполняют некоторые операции с этими коллекциями, вызывая некоторые методы, определенные в интерфейсе MyCollection.
  3. Я бы не хотел добавлять к нему универсальный тип.

В описанной ситуации плохая идея - не параметризовать универсальный класс 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.

Итак, вопрос:

  1. отсутствие параметризации ссылки на универсальный тип всегда плохо?
  2. Если ответ на 1 - НЕТ, можно ли этого не делать?
  3. Если ответ 1 - ДА, как я могу использовать метод MyCollection из класса UserClass, не зная их общие типы?
  4. У меня плохой дизайн?

Я надеюсь, что все было ясно. Я борюсь с этой проблемой несколько дней, и я понятия не имею. Помогите, пожалуйста.

5
задан Community 23 May 2017 в 11:55
поделиться