Подтвердить что ты не робот

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(){}
}

Если бы я был неясен, я с удовольствием попробую уточнить мои намерения.

4b9b3361

Ответ 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)