替代泛型方法
问题描述:
在JLS(Java语言规范)中:subignature的概念被设计用来表示两个方法之间的关系,这两个方法的签名不相同,但其中一个可能会覆盖另一个。具体来说,它允许一个方法,其签名不使用泛型来覆盖该方法的任何泛型化版本。替代泛型方法
interface CollectionConverter<U> {
<T> List<T> toList(Collection<T> c);
void fooMethod(Class<?> c);
<E>Comparable<E> method3(E e);
Comparable<U> method4(U u);
}
class Overrider implements CollectionConverter<Integer> {
@Override
public List toList(Collection c) {
return null;
}
@Override
public void fooMethod(Class c) {
}
@Override
public Comparable method3(Object o) {
return null;
}
@Override
// compile error, have to change Object to Integer
public Comparable method4(Object u) {
return null;
}
}
根据JLS,我明白了为什么第3种方法工作得很好,但为什么有方法4编译错误,说类型超控器的方法,方法4(对象)必须覆盖或实现我无法弄清楚超类型方法。
答
的在CollectionConverter
签名是
Comparable<U> method4(U u);
您声明Overrider
实现CollectionConverter<Integer>
,从而类型参数U
结合Integer
。然后签名变为:
Comparable<Integer> method4(Integer u);
可以声明一个在Overrider
method4(Object u)
,但该方法的签名不重写接口中指定method4(Integer u)
任何比它如果你不使用泛型都多。
答
因为在接口中,method4被声明为具有与接口(U)相同的类型参数。如果你把它改成别的东西,它应该可以工作。
例如
<A> Comparable<A> method4(A a);
答
问题是可变U
类型在该点被绑定到Integer
。如果更改声明
public Comparable method4(Integer u) ...
这是一个覆盖
但是,在类型擦除之后,所有类型参数均由Object或第一个边界替换为“extends”列表。就像前三种方法一样,在擦除之后,前三种方法的签名与Overrider类中的签名完全相同。在这之后,method4的签名和返回类型应该是:可比较的方法4(Object u),它与Overrider中的相同。所以,这是我的问题 – 2012-03-18 21:09:04
@RobyYan - 泛型不仅仅是从最小上界向下铸造的语法糖。在_after_编译器检查类型安全性类型擦除踢。泛型的整体思想是让编译器为你做类型检查。迫使编译器进行分析,就好像类型擦除已经被应用一样,将是无望的;几乎没有什么可以与之合作的。 – 2012-03-18 21:50:44
“泛型的全部概念是让编译器为你做类型检查,强制编译器进行分析,就好像已经应用了类型擦除一样,这是毫无希望的;几乎没有任何东西可以与它一起工作“。明白了,我几乎忘记了泛型的最初目的,谢谢你的回答 – 2012-03-19 16:51:10