public class Test<T>
{    public boolean equals(T value)
    {
        return true;
    }
}
在擦除后就变成了
public class Test
{    public Test()
    {
    }    public boolean equals(Object value)
    {
        return true;
    }
}equals不就是equals(Object value)吗,跟从object继承的不就一样了,为什么说是和从object继承的equals方法发生冲突呢?
请教位高手帮帮,是在是迷惑???

解决方案 »

  1.   

    这样写,Test<T> t = new Test<T>();
    那你的实例里就有两个public boolean equals(Object value)了;
    所以T是不能用于区分重载的。
      

  2.   

    T只不过是一个标识,并不是实际意义上存在的啊,换成E,A什么的都可以,但是由于equals是Object的方法,所以系统会认为你重写了Object的该方法,但是对于重写来说,你的equals方法本身就是错了,如果你重载的话就不会报错了
      

  3.   

    实际上,泛型在编译时,可以被编译器理解,
    但在运行时,泛型会被擦除(erased)。真是因为这样,编译器发现他认为的两个并不相同的方法,在运行时刻会变成相同的,因此报错。
    这应该也是编译器考虑到安全起见,Object.equals()方法是非泛型的,所以不能用泛型的方式重载之。
      

  4.   

    上面的泛型类Test和下面的Test是不同的啊,泛型之后表示该类型的对象里面只能存储T类型的对象,而下面的Test只能存放Test类型的.
    假如说你的Test是类似List的类,Test类中有一个add(T t){}方法,则对于泛型类Test<String> test = new Test<String>(),那么这个Test中只能存放String类型的对象,否则就会报错,如test.add(new Object())就会报错,而test.add(new String())才正确.泛型Test在new Test()的时候,也就是在编译的时候就已经决定了里面存放那种类型的对象,所以可以避免运行时类转型异常.
    而对于下面的Test,如果存在一个add(Object obj)方法,那么这个add方法可以添加任何类型的对象,这样会增加运行时出现类转型异常的几率
      

  5.   

    实际上你的这个问题算是一针见血,网上关于这个问题有过一些讨论国外也有,
    也许是sun有所考虑,也许是考虑的有所欠缺,总之,编译器和虚拟机没有在这个问题上,有机的统一,
    虽然擦除后是相同的方法,但在编译器看来,确实是两个不同的方法,不符合重写的条件,也不满足重载的要求。