在准备SCJP-6考试时,我遇到了一个棘手的问题。我自己找不到答案。请回答问题并简短评论:
abstract class A<K extends Number> {
// insert code here
}
public abstract <K> A<? extends Number> useMe(A<? super K> k);
public abstract <K> A<? super Number> useMe(A<? extends K> k);
public abstract <K> A<K> useMe(A<K> k);
public abstract <V extends K> A<V> useMe(A<V> k);
public abstract <V super K> A<V> useMe(A<V> k);
public abstract <V extends Character> A<? super V> useMe(A<K> k);
public abstract <V super Character> A<? super V> useMe(A<K> k);
可以在上面的占位符中插入哪种方法?
P.S。 我试着看看规范。那些对我没有帮助。
答案 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即可。