Дженерики и специализированные конструкторы Java

(Вероятно, это дубликат, но я не смог его найти - не стесняйтесь указать на это)

Рассмотрим следующий класс Java:

public class A {
    public A(T0 t0, T1 t1) {
        ...
    }
}

Создать экземпляр этого класса легко, используя что-то вроде новый A (1, "X") .

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

Если бы A не использовал дженерики, обычное расширение было бы дополнительным конструктором без второго аргумента:

public class A {
    public A(int t0, String t1) {
        ...
    }

    public A(int t0) {
        this(t0, new String("X"));
    }
}

К сожалению, это не представляется возможным для класса, который действительно использует дженерики - по крайней мере, без принудительного приведения:

    public A(T0 t0) {
        this(t0, (T1)(...));
    }

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

Чуть более элегантное решение включает использование подкласса:

 public class B extends A {
     ...
 }

Но этот подход заставляет еще одну ветвь в иерархии классов и еще один файл класса с тем, что по сути является шаблонным кодом .

  • Есть ли способ объявить конструктор, который принудительно устанавливает один или несколько параметров типа к определенному типу? Что-то с теми же эффектами, что и использование подкласса, но без хлопот?

  • Есть ли что-то в корне неправильное в моем понимании дженериков и / или моем дизайне? Или это допустимая проблема?

9
задан thkala 12 December 2011 в 17:07
поделиться