Быть проблемами с дженерикамиJAVA

Программисты JAVA общаются здесь
Anonymous
Быть проблемами с дженериками

Сообщение Anonymous »

Приносим извинения за плохое название. Я был бы признателен за некоторую помощь в создании лучшего, но я даже не знаю, как описать мою проблему. Типы. < /p>
interface M {}
interface F {}
< /code>
И скажем, что я делаю класс, который реализует оба этих интерфейса. < /p>
record A (A1 a1, A2 a2)
implements
M,
F
{}
< /code>
ОК, круто. Теперь я могу использовать везде, где я бы использовал m или f .
Теперь вот моя проблема. Я пытаюсь сделать следующее и терпеть неудачу с ошибками компилятора. < /P>
public class DoublyNestedGenerics
{

interface M {}

interface F {}

record A (A1 a1, A2 a2)
implements
M,
F
{}

private
static
<
D1,
D2,
D extends
M
& F
>
D
canItWork(final D1 d1, final D2 d2)
{

// return new A(d1, d2);
throw new UnsupportedOperationException();

}

}
< /code>
ОК, так что все компилируется. Но если я расстроен возвращение и заменим исключение, я получаю следующую ошибку компиляции. < /P>
DoublyNestedGenerics.java:28: warning: [rawtypes] found raw type: A
return new A(d1, d2);
^
missing type arguments for generic class A
where A1,A2 are type-variables:
A1 extends Object declared in record A
A2 extends Object declared in record A
< /code>
ОК, имеет смысл. Позвольте мне изменить возвращение, чтобы быть этим. < /P>
return new A(d1, d2);
< /code>
Нажатие компиляции дает мне следующую ошибку компилятора. < /p>
DoublyNestedGenerics.java:28: error: incompatible types: cannot infer type arguments for A
return new A(d1, d2);
^
reason: no instance(s) of type variable(s) A1,A2 exist so that A conforms to D
where A1,A2,D,D1,D2 are type-variables:
A1 extends Object declared in record A
A2 extends Object declared in record A
D extends M,F declared in method canItWork(D1,D2)
D1 extends Object declared in method canItWork(D1,D2)
D2 extends Object declared in method canItWork(D1,D2)
1 error
< /code>
Я не полностью понял ошибку, поэтому я решил упростить проблему. Just D1 и d2 . Вот как выглядит новый метод. < /P>
private
static
<
D extends
M
& F
>
D
canItWorkAttempt2(final Integer d1, final Integer d2)
{

// return new A(d1, d2);
throw new UnsupportedOperationException();

}
< /code>
заменять комментарии и нажатие компиляции дало мне следующую ошибку компилятора. < /p>
DoublyNestedGenerics.java:44: error: incompatible types: cannot infer type arguments for A
return new A(d1, d2);
^
reason: no instance(s) of type variable(s) A1,A2 exist so that A conforms to D
where A1,A2,D are type-variables:
A1 extends Object declared in record A
A2 extends Object declared in record A
D extends M,F declared in method canItWorkAttempt2(Integer,Integer)
1 error
< /code>
ОК, намного меньше, и, следовательно, легче анализировать. Запишите .
Ну, это не правильно - это должно быть целым числом , а не Object . Может быть, вывод нуждается в некоторой помощи. Итак, я изменил возвращение на это вместо этого. < /P>
return new A(d1, d2);
< /code>
, которая привела к следующей ошибке компилятора. < /p>
DoublyNestedGenerics.java:44: error: incompatible types: A cannot be converted to D
return new A(d1, d2);
^
where D is a type-variable:
D extends M,F declared in method canItWorkAttempt2(Integer,Integer)
1 error
< /code>
Прогресс! Теперь у меня начались подозрения, и, подтвердив их, я решил значительно упростить свою проблему. Я создал следующий класс. < /P>
record N (Integer n1, Integer n2)
implements
M,
F
{}
< /code>
Скомпилируется без проблем. Красиво, давайте попробуем изменить тип возврата, чтобы использовать это вместо этого. Вот что я изменил возвращение к. < /P>
return new N(d1, d2);
< /code>
С большими надеждами я нажал компиляцию. < /p>
DoublyNestedGenerics.java:50: error: incompatible types: N cannot be converted to D
return new N(d1, d2);
^
where D is a type-variable:
D extends M,F declared in method canItWorkAttempt2(Integer,Integer)
1 error
< /code>
Очень разочаровывает. Но что -то еще выскочило мне. В ошибке говорится, где D является VAIAIL: D Extends M , f .
Они использовали слово < em> расширяет . Из отчаяния я попытался добавить следующие типы. < /P>
interface C extends M, F {}

record N2 (Integer n1, Integer n2) implements C {}
< /code>
А затем, оттуда, я изменил свой возврат, чтобы сказать это. < /p>
final C blah = new N2(d1, d2);
return blah;
< /code>
Затем я нажал компиляцию. < /p>
DoublyNestedGenerics.java:55: error: incompatible types: C cannot be converted to D
return blah;
^
where D is a type-variable:
D extends M,F declared in method canItWorkAttempt2(Integer,Integer)
1 error
< /code>
На данный момент я раздражен. /код>. И это также говорит мне, что D-это переменный тип , в частности, D расширяет m , f , что именно то, что c Делает . И все же, это все еще не работает? Что мне не хватает? И опять же, хотела бы, чтобы какая -то помощь в создании лучшего названия, если кто -то хочет внести предложения. /p>
public class DoublyNestedGenerics
{

interface M {}

interface F {}

record A (A1 a1, A2 a2)
implements
M,
F
{}

record N (Integer n1, Integer n2)
implements
M,
F
{}

interface C extends M, F {}

record N2 (Integer n1, Integer n2) implements C {}

private
static
<
D1,
D2,
D extends
M
& F
>
D
canItWork(final D1 d1, final D2 d2)
{

// return new A(d1, d2);
throw new UnsupportedOperationException();

}

private
static
<
D extends
M
& F
>
D
canItWorkAttempt2(final Integer d1, final Integer d2)
{

final C blah = new N2(d1, d2);
return blah;
// return new N(d1, d2);
// throw new UnsupportedOperationException();

}

}


Подробнее здесь: https://stackoverflow.com/questions/794 ... h-generics

Вернуться в «JAVA»