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时就是指定的类型了,所以不会无论如何都能正确获取到类型的。

    评论

报告相同问题?

悬赏问题

  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码