package com.tao.test;import java.util.Date;
public class Test5{
public static void main(String[] args) throws ClassNotFoundException {
DateInter dateInter=new DateInter();
Pair<Date> pair=dateInter;
pair.setSecond(new Date());
}
}
class Pair<T> {
private T first;
private T second; public Pair() {
first = null;
second = null;
} public Pair(T first, T second) {
this.first = first;
this.second = second;
} public T getFirst() {
return first;
} public void setFirst(T first) {
this.first = first;
} public T getSecond() {
return second;
} public void setSecond(T second) {
System.out.println("父类的方法");
this.second = second;
}
}class DateInter extends Pair<Date> {

@Override
public void setSecond(Date second) {
System.out.println("aa");
}
}先贴代码,下面在问问题,一个个的说,希望大家指导下!!!

解决方案 »

  1.   

    问题:
    我看到类型擦除,也就是说父类的Pair中的setSecond方法被擦除为Object的原始类型public void setSecond(Object second) {
            System.out.println("父类的方法");
            this.second = second;
        }那么在子类DateInter 中又定义了一个setSecond,它们之间形参类型不一样,也就是说不会覆盖,那么就是继承中的重载了。那么为什么在子类不能这样调用 dateInter.setSecond(new Object());
      

  2.   

    lz,class DateInter extends Pair<Date> {
        
        @Override
        public void setSecond(Date second) {
            System.out.println("aa");
        }
    }在你的子类中的setSecond方法上你有了@Override注释,表示被注释的方法覆盖了父类中的一个方法。因此,子类不能这样调用 dateInter.setSecond(new Object());
      

  3.   

    你的子类已经将泛型参数实例化了,object的父类已经不是这个子类的基类了
      

  4.   

    你的子类是对Pair<Date>进行继承的,在这里已经确定了基类就是Pair<Date>而不是Pair<T>,即Pair<Object>也不可能是DateInter 的基类了。public void setSecond(Object second)就不是DateInter 基类的方法了,它的基类对应的方法是是个    
    public void setSecond(Date second) {
            System.out.println("父类的方法");
            this.second = second;
        }
      

  5.   

    回复2L
    看到Override,确实是覆盖了,可是为什么会覆盖啊?
    类型擦除后,父类的setSecond参数不是Object吗,参数类型和子类的不一样,为什么会覆盖,应该是重载啊?
      

  6.   

    回复3L,类型擦除,会还原为原始类型的,JVM中是不存泛型这一概念的。
      

  7.   

    “JVM中是不存泛型这一概念的”可以理解为在运行时没有泛型这个概念,你现在还在编译阶段,因为你已经继承了的参数化的类型,所以里面方法的参数的类型就应该与类的参数一样了,如果不一样,编译就会报错
      

  8.   

    “JVM中是不存泛型这一概念的”可以理解为在运行时没有泛型这个概念,你现在还在编译阶段,因为你已经继承了的参数化的类型,所以里面方法的参数的类型就应该与类的参数一样了,如果不一样,编译就会报错
      

  9.   

    “JVM中是不存泛型这一概念的”可以理解为在运行时没有泛型这个概念,你现在还在编译阶段,因为你已经继承了的参数化的类型,所以里面方法的参数的类型就应该与类的参数一样了,如果不一样,编译就会报错