Java 泛型方法与多态,这样解释对吗

2019-09-07 16:33:04 +08:00
 amiwrong123
class A{}
class B extends A{}

class GenericMethods {
    public <T> T f1(T x) {
        System.out.println(x.getClass().getName());
        return x;
    }
}

public class testP {
    public static void main(String[] args) {
        GenericMethods gm = new GenericMethods();
        A a = gm.f1(new B());
        //B b = gm.f1(new A());编译报错
    }
}

f1 方法是一个泛型方法,返回值是< >里的T,形参也是< >里的T。所以二者推断出来的具体类型必须一样,或者符合多态。

执行A a = gm.f1(new B())时,返回值处的T被推断为A,形参处的T本来会被推断为B,但是由于前者,形参处的T这里被推断为A。这里传B对象作为实参符合多态,泛型和多态不冲突。

还有就是 B b = gm.f1(new A());编译通不过怎么解释比较好,可以认为这句是推断为B返回的也是B只是这里不允许向下转型吗?

6388 次点击
所在节点    Java
28 条回复
amiwrong123
2019-09-08 13:55:30 +08:00
@Bromine0x23
不好意思,刚才没注意到那个静态方法的返回值。修改静态方法后可执行。

经过测试发现,虽然成员的泛型方法和泛型类用了同一个标识符 T,但是成员泛型方法的 T 并没有被对象的具体类型 CountedObject 所覆盖,而是独立于对象的。
guyeu
2019-09-08 18:35:08 +08:00
向下转型在 Java 里是不存在的,只能把一个对象转为对象真正的类型或者它的派生类。
你可以把泛型理解为一个语法糖,这个语法糖的作用只是做一种类型提示,告诉编译器这个地方可能是什么类型,帮助用户和编译器做类型推断来检查一些错误。
Justin13
2019-09-08 19:39:24 +08:00
我的理解是泛型就是多态的一种,泛型函数更关注数据结构(接口)而非具体的数据类型。
godloveplay
2019-09-25 18:45:20 +08:00
@guyeu #22 "只能把一个对象转为对象真正的类型或者它的派生类"
这个派生类是说反了吗?

class B extend A
B 是 A 的派生类,A 是 B 的基类,B 由 A 派生出来

只能把一个对象转为对象真正的类型或者它的基类?
guyeu
2019-09-25 20:17:57 +08:00
@godloveplay #24 对对对,应该是基类。
guyeu
2019-09-25 20:19:02 +08:00
@godloveplay #24 对象的类型并不会发生改变,改变的是引用的类型。
godloveplay
2019-09-25 23:26:23 +08:00
@guyeu #26 看得我陷入转牛角尖的状态。。
有个疑问,那这个强转背后到底做了哪些事情,怎么实现的。- -
```java Object o = new A(); A a = (A) o```
guyeu
2019-09-26 13:44:01 +08:00
@godloveplay #27 这个对象本来就是 A,强转也不过是是检查一下对象的类型

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/598864

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX