Метод, берущий Объект и любой из его суперклассов - PullRequest
0 голосов
/ 26 февраля 2020

Для достижения.

Метод signal должен принимать

  1. любой Объект N
  2. любой из объектов суперклассы Class<?super N>
<N>void
signal(N n, Class<?super N> n_super)
{
  /*...*/
}

Все должно быть в порядке, чтобы позвонить

Object object=new Object();
signal(object, object.getClass());

, поскольку Object - супер тип object. Но его вызов дает Waring . В словах IDE:

IntelliJ (Android Studio)

Неверный тип второго аргумента. Найдено Class<? extends Object>, требуется: Class<? super Object>

Затмение

Метод signal(N, Class<? super N>) не применим для аргументов (Object, Class<? extends Object>)

Вопросы.

  1. Можно ли достичь цели, как я пытался , и, если да,
  2. , как можно устранить предупреждение?

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Превращение моих комментариев в ответ.

Два подхода, которые я могу быстро придумать:


Используйте Object.class прямо здесь. signal(object, Object.class); прекрасно компилируется без предупреждений о моей java версии.


Измените сигнатуру вашего метода на что-то вроде:

<N, M extends N> void signal(N n, Class<? super M> n_super)

, что должно позволить вам называть ее так, как вы уже есть (как в signal(object, object.getClass());).

0 голосов
/ 26 февраля 2020

используйте что-то вроде этого:

Object object=new Object();
Class c = object.getClass();
signal(object, c);
...