6

在准备 SCJP-6 考试时,我遇到了一个难题。我自己找不到答案。请回答问题并发表简短评论:

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);

上面的占位符中可以插入哪种方法?

PS我试图查看规范。那些对我没有帮助。

4

4 回答 4

3

解决这个问题的最好方法是尝试每一个,看看编译器告诉你什么。我得到以下每个结果(使用 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
于 2010-05-26T15:16:03.190 回答
3

答案 1,2,3:泛型类型K隐藏类类型K。在这些方法K中只是新的泛型类型。编译器试图通过条件评估<K extends Number>。方法 1,2 通过和 3 - 失败。

答案 4 完全正确。

答案 5,7 有语法错误。

答案 6 不正确,因为测试<V extends Number>会失败。

于 2010-07-28T10:22:42.383 回答
1

我将尝试解释更多...

1 不起作用,因为您不能替换A<? super K>...A<K extends Number>不能保证超类扩展与子类相同的类。

1、2 和 3 不起作用,因为初始类型参数隐藏了类声明中使用的原始 K。

5 不起作用,因为<V super K>不能替代<K extends Number>......不能保证超类扩展与子类相同的类。

6 & 7 应该是显而易见的。

4 有效,因为如果我们知道 V 扩展了 K,那么我们就知道 V 扩展了 Number(因为 K 扩展了 V 的所有类都扩展了)。A<V>因此,我们可以代替<K extends Number>

我希望这是有道理的……有人可能会过来解释得更好。

于 2010-05-26T15:50:42.843 回答
0

只有第二个 ( public abstract A useMe(A k);) 似乎有效,只需将其插入 IDE。

于 2010-05-26T15:13:56.497 回答