Вопрос относительно экзамена SCJP-6

При подготовке к экзамену SCJP-6 I сталкивающийся со сложным вопросом. Я не могу найти ответ один. Ответ для вопроса и дает короткие комментарии:

abstract class A<K extends Number> {
   // insert code here
}    
  1. public abstract <K> A<? extends Number> useMe(A<? super K> k);

  2. public abstract <K> A<? super Number> useMe(A<? extends K> k);

  3. public abstract <K> A<K> useMe(A<K> k);

  4. public abstract <V extends K> A<V> useMe(A<V> k);

  5. public abstract <V super K> A<V> useMe(A<V> k);

  6. public abstract <V extends Character> A<? super V> useMe(A<K> k);

  7. public abstract <V super Character> A<? super V> useMe(A<K> k);

Какой метод может быть вставлен в заполнителя выше?

P.S. Я пытался считать спецификацию. Они каждый не был полезен для меня.

6
задан abatishchev 26 May 2010 в 15:07
поделиться

3 ответа

Только второй ( общедоступный аннотация A useMe (A k); ), похоже, работает, просто подключив его к IDE.

0
ответ дан 17 December 2019 в 00:04
поделиться

Лучший способ сделать это - попробовать каждый из них и посмотреть, что вам сообщает компилятор. Я получаю следующие результаты для каждого из них (с использованием NetBeans, поэтому ваши результаты могут незначительно отличаться):

public abstract <K> A<? extends Number> useMe(A<? super K> k);
// seems to work

public abstract <K> A<? super Number> useMe(A<? extends K> k);
// type parameter ? extends K is not within its bound

public abstract <K> A<K> useMe(A<K> k);
// type parameter K is not within its bound

public abstract <V extends K> A<V> useMe(A<V> k);
// seems to work

public abstract <V super K> A<V> useMe(A<V> k);
// > expected
// illegal start of type
// <identifier> expected
// missing method body, or declare abstract
// cannot find symbol
//   symbol: class V
//   location: class A<K>

public abstract <V extends Character> A<? super V> useMe(A<K> k);
// type parameter ? super V is not within its bound

public abstract <V super Character> A<? super V> useMe(A<K> k);
// > expected
// illegal start of type
// <identifier> expected
// missing method body, or declare abstract
3
ответ дан 17 December 2019 в 00:04
поделиться

Попробую объяснить немного подробнее ...

1 не работает, потому что вы не можете заменить A для A ... нет гарантии, что суперкласс расширяет тот же класс, что и подкласс.

1, 2 и 3 не работают, потому что параметр начального типа скрывает исходный K, используемый в объявлении класса.

5 не работает, потому что не может заменить ... нет гарантии, что суперкласс расширяет тот же класс, что и подкласс.

6 и 7 должны быть очевидны.

4 работает, потому что если мы знаем, что V расширяет K, то мы знаем, что V расширяет Number (поскольку все классы, которые K расширяет V, расширяются). Поэтому мы можем заменить A на .

Надеюсь, это имеет смысл ... кто-то может прийти и объяснить лучше.

1
ответ дан 17 December 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: