(Возможно, это дубликат, но я не смог его найти - не стесняйтесь указывать на это)
Рассмотрим следующий класс Java:
public class A<T0, T1> {
public A(T0 t0, T1 t1) {
...
}
}
Создать этот класс легко, используя что-то вроде new A<Integer, String>(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)(...));
}
Причина?Хотя этот конструктор принимает только один аргумент, он по-прежнему использует параметры типа два , и нет никакого способа узнать a priori , что независимо от типа T1
пользователь класса предоставитсовместим со значением по умолчанию, используемым в конструкторе.
Несколько более элегантное решение предполагает использование подкласса:
public class B<T0> extends A<T0, String> {
...
}
Но этот подход заставляет еще одну ветвь в иерархии классов и все жедругой файл класса, который по сути представляет собой шаблонный код .
Есть ли способ объявить конструктор, который приводит один или несколько параметров типа к определенному типу?Что-то с теми же эффектами, что и при использовании подкласса, но без хлопот?
Есть ли что-то принципиально неправильное в моем понимании обобщений и / или моего дизайна?Или это актуальная проблема?