akanegasakisora 2015-12-06 19:03 采纳率: 0%
浏览 2496

子类调用父类的泛型方法,为何不用强转就能得到正确的类型,父类编译的时候不是泛型擦出了吗?

以下面这个简单例子演示:
这是父类

 public abstract class GenericFather<T> {

    public T getT(T t){
        return t;
    }
}

通过反编译可以得知编译后泛型擦出,T都用Object代替了
也就是说只要调用父类方法最后肯定返回的是个Object类型

 public abstract class GenericFather
{

    public GenericFather()
    {
    }

    public Object getT(Object t)
    {
        return t;
    }
}

那么问题来了,为何子类调用父类方法时可以不用强转就得到正确的类型?问题到底出在哪里?

  • 写回答

3条回答 默认 最新

  • 毕小宝 博客专家认证 2015-12-07 00:42
    关注

    你可以写个子类继承你的父类,如果你没有指定泛型类型,那么java编译器会默认泛型类型就是Object的,即父类的方法声明默认成了getT(Object)

    //编译器给出警告,GenericFather is a raw type. References to generic type GenericFather<T> should be parameterized
     public class Son extends GenericFather{
       //调用getT时必须制定参数类型就是Object
        Son s = new Son();
            s.getT(t)
    }
    

    如果你指定了泛型的具体类型,那么你调用getT时就是指定的类型了,所以不会无论如何都能正确获取到类型的。

    评论

报告相同问题?

悬赏问题

  • ¥20 matlab计算中误差
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊