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