为了账号安全,请及时绑定邮箱和手机立即绑定

java 泛型(类)方法返回值为什么是 Object??

java 泛型(类)方法返回值为什么是 Object??

qq_遁去的一_1 2019-01-16 17:25:46
我认知中,java 虚拟机是不认识泛型类或泛型方法的,所以在编译成字节码的时候,所有的泛型类或泛型方法,都会被转换成普通的类或方法。 例如: // 泛型类 class Test<T> { public T res = null; public Test(T res){ this.res = res; } public T get(){ return this.res; } } Test t = new Test<String>("泛型类-Test的泛型方法-get"); // 报错 String res = t.get(); 编译时类型参数发生替换(类型擦除),也就是编译后的字节码中的代码应该长下面这样: public class Test { private String res = null; public Test(String res){ this.res = res; } public String get(){ return this.res; } } Test t = new Test("泛型类-Test的泛型方法-get"); // 报错!类型擦除后,为什么调用该方法返回的类型是:Object ? String t = t.get(); 问题就出现在: Test t = new Test<String>(); // 报错!这边返回的是 Object String res = t.get(); 我很郁闷 .... ,不能理解为什么提供了类型参数后进行方法调用返回的不是提供的类型 String 而是 Object 类型? 然而,在如下场景中,结果却正确了 // 结果正确 Test<String> t = new Test<>(); String res = t.get(); 这是为什么??
查看完整描述

3 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

泛型本来就是要在声明时候用的。。。

Test<String> t = new Test<>();

这样写编译器才知道t这个引用是个带String泛型的Test引用。

Test t = new Test<String>();

这么写编译器只知道t这个引用指向了带String泛型的一个对象。。。
但是不知道t是带泛型的。。。
而你t.get() 这个方法是t这个引用调用的方法。。。
后一种写法编译器不知道你这个引用带泛型。。。就默认是Object类型。。。

查看完整回答
反对 回复 2019-02-12
?
当年话下

TA贡献1890条经验 获得超9个赞

Test t等同于 Test<Object> t, 返回期待是 Object,但实际也是 String , 所以你需要仅是加上强制转换就好,即

String res = (String)t.get();
查看完整回答
反对 回复 2019-02-12
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

Object是一切的基类,所有的类都是Object,反射使用Object,可以保证通用性。
实际使用的时候,需要基于反射,进行类型的判断和转换。
有把握的进行强制转化,也可以先判断一下(instanceof ),更多的还是根据实际业务进行封装相应的工具类

查看完整回答
反对 回复 2019-02-12
  • 3 回答
  • 0 关注
  • 521 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信