关于SCJP-6考试的问题

时间:2010-05-26 14:59:47

标签: java generics scjp

在准备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);

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

    P.S。 我试着看看规范。那些对我没有帮助。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

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

答案4完全正确。

答案5,7有语法错误。

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

答案 2 :(得分:1)

我会尝试解释一下......

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

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

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

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

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

我希望这是有道理的......有些人可能会更好地解释。

答案 3 :(得分:0)

只有第二个(public abstract A useMe(A k);)似乎可以正常工作,只需将其插入IDE即可。