«оба метода имеют одинаковое удаление» с использованием параметров ограниченного типа - PullRequest
0 голосов
/ 29 мая 2018

Я впервые использую дженерики в Java и столкнулся с проблемой, которую мне не удалось решить: почему это компилируется:

public interface Aa{}
public interface Bb{}
public interface Cc{}


public static <GenericAB extends Aa & Bb>
void method(GenericAB myABobject1, GenericAB myABobject2){}

public static <GenericAB extends Aa & Bb, GenericCA extends Cc & Aa>
void method(GenericAB myAbobject, GenericCA myCAobject){}

Но это не так:

public interface Aa{}
public interface Bb{}
public interface Cc{}


public static <GenericAB extends Aa & Bb>
void method(GenericAB myABobject1, GenericAB myABobject2){}

public static <GenericAB extends Aa & Bb, GenericAC extends Aa & Cc>
void method(GenericAB myAbobject, GenericAC myACobject){}

И я получаю эту ошибку: оба метода имеют одинаковое удаление .

Извините, если это глупый вопрос, но я не понимаю, почемупорядок интерфейсов в объявлении параметра ограниченного типа кажется важным.На самом деле я не думаю, что именно порядок вызывает ошибку, но я не понимаю, что делает.

Я читаю эту документацию Oracle , там написано, что ядолжен поставить класс в качестве первого параметра, но Aa, Bb и Cc все интерфейсы.Извините за мой английский тоже.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Поскольку во время выполнения после удаления типа оба метода имеют одинаковый заголовок метода

public static <GenericAB extends Aa & Bb> void method(GenericAB myABobject1, GenericAB myABobject2){}

становится

public static void method(Aa myABobject1, Aa myABobject2){}

, а

public static <GenericAB extends Aa & Bb, GenericBC extends Aa & Cc>void method(GenericAB myAbobject, GenericBC myBCobject){}

становится

public static void method(Aa myAbobject, Aa myBCobject){}

оба метода имеют одинаковую сигнатуру, что приводит к вашей ошибке

РЕДАКТИРОВАТЬ после того, как комментарии ниже параметров исправлены

0 голосов
/ 29 мая 2018

Порядок имеет значение ( §4.6 ):

Стирание переменной типа (§4.4) - это стирание ее крайней левой границы.

GenericBC стирает до Aa или Cc, в зависимости от того, что появляется первым (то есть крайним слева) на границе.

Также см. учебник по стиранию типов и стирание типа, когда и что происходит Q & A для объяснения стирания типа в целом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...