替代泛型方法

问题描述:

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

可以声明一个在Overridermethod4(Object u),但该方法的签名不重写接口中指定method4(Integer u)任何比它如果你不使用泛型都多。

+0

但是,在类型擦除之后,所有类型参数均由Object或第一个边界替换为“extends”列表。就像前三种方法一样,在擦除之后,前三种方法的签名与Overrider类中的签名完全相同。在这之后,method4的签名和返回类型应该是:可比较的方法4(Object u),它与Overrider中的相同。所以,这是我的问题 – 2012-03-18 21:09:04

+0

@RobyYan - 泛型不仅仅是从最小上界向下铸造的语法糖。在_after_编译器检查类型安全性类型擦除踢。泛型的整体思想是让编译器为你做类型检查。迫使编译器进行分析,就好像类型擦除已经被应用一样,将是无望的;几乎没有什么可以与之合作的。 – 2012-03-18 21:50:44

+0

“泛型的全部概念是让编译器为你做类型检查,强制编译器进行分析,就好像已经应用了类型擦除一样,这是毫无希望的;几乎没有任何东西可以与它一起工作“。明白了,我几乎忘记了泛型的最初目的,谢谢你的回答 – 2012-03-19 16:51:10

因为在接口中,method4被声明为具有与接口(U)相同的类型参数。如果你把它改成别的东西,它应该可以工作。

例如

<A> Comparable<A> method4(A a); 

问题是可变U类型在该点被绑定到Integer。如果更改声明

public Comparable method4(Integer u) ... 

这是一个覆盖