Java Generic с 1 параметром типа и 2 ограничениями
Я знаю, что можно добавить несколько ограничений в определение общего класса, например:
class Example<I extends Object & Comparable<Object>>{}
Но я хочу, чтобы общий (MyGeneric
) принимал в качестве своего параметра типа другой общий (SomeGeneric<T>
) и ограничивал параметр типа (T
) этого общего (например, T extends SomeClass
).
Важно, мне нужно знать типы как SomeGeneric
, так и SomeClass
внутри класса (G
и T
необходимо, чтобы оба были связаны). Например, представьте себе что-то вроде этого:
class MyGeneric<G extends SomeGeneric<T>, T extends SomeClass>
{
public G returnSomeGenericImpl(){}
public T returnSomeClassImpl(){}
}
Вопрос:
Вышеупомянутые работы, но я бы предпочел, чтобы мой класс имел только один параметр типа, чтобы сделать жизнь проще для исполнителей моего класса. Есть ли способ сделать это?
Что-то вроде этого было бы неплохо (но этот конкретный код неверен):
class MyGeneric<G extends SomeGeneric<T extends SomeClass>>
{
public G returnSomeGenericImpl(){}
public T returnSomeClassImpl(){}
}
Если бы я был неясен, я с удовольствием попробую уточнить мои намерения.
Ответы
Ответ 1
Это невозможно сделать.
После сокращения вашего определения типа одним порядком, удалив одну переменную типа и попытавшись определить ее,
class G extends SomeGeneric<T extends SomeClass>{}
не компилируется, потому что параметр типа T не связан по отношению к уже определенному параметру типа. Но, это работает -
class G<T extends SomeClass> extends SomeGeneric<T>{}
Итак, я полагаю, что единственный способ параметризации с двумя типами - объявить их спереди.
Ответ 2
попробуйте это
class Test1<T extends List<? extends Number>> {
public static void main(String[] args) throws Exception {
new Test1<ArrayList<Number>>();
new Test1<ArrayList<Integer>>();
new Test1<ArrayList<Object>>(); // compile error
}
}
Ответ 3
Представьте себе следующее:
Type t = someClass();
Type g = someGeneric(t);
foobar(g,t)
по сравнению с этим
Type g = someGeneric(someClass());
foobar(g,?)
второй - решение Евгения Дорофеева.
Вы видите проблему? Вы не можете привязываться к переменной в аргументе. То же самое с дженериками.
Что вы хотите сделать, это
Type g = someGeneric(Type t = someClass());
foobar(g,t)