Java泛型方法怎样返回约束的不同的类型
谢邀,改成下面这样就好public Class\u0026lt;? extends I\u0026gt; toClass() { if (this == A) return ClassA.class; else if (this == B) return ClassB.class; else return null;}下面所有讨论不考虑toClass()返回null的情形....
考虑下面这个调用的场景:Class\u0026lt;Xxx\u0026gt; clazz = Yyy.toClass();Xxx可以是ClassA,也可以是ClassB
Yyy可以是TestEnum.A也可以是TestEnum.B
实际擦除之后会变成下面这样:Class clazz = (Xxx) Yyy.toClass(); 【Java泛型方法怎样返回约束的不同的类型】 换句话说,需要保证toClass()方法的所有可能的返回值,都必须能够强制转换为所有可能的Xxx。然而比如ClassB.class是toClass()的一种可能的返回值,而ClassA是Xxx的一种可能的类型,它俩并不能转换。
而使用通配符就不一样了,只要是你返回的类型是extends I的,我通吃,使用通配符的时候会变成下面这样Class\u0026lt;?\u0026gt; clazz = Yyy.toClass();这个意思就是返回的Class的具体类型我不知道,但是我知道这个类型必须要extends I(因为在toClass()方法上限制了嘛\u0026lt;? extends I\u0026gt;),换句话说,只要你返回的类型是I或者I的子类/子接口,我都认,再换句话说就是只要你返回的类型能够向上提升为I,我都认,也即下面这样Class clazz = (I)Yyy.toClass();现在这个Yyy.toClass()就只能返回ClassA或者ClassB,这俩都能提升为I,所以没有问题。但是如果你在toClass()方法的某个return的地方返回一个Object.class的话,它就会告诉你,Class\u0026lt;Object\u0026gt;和Class\u0026lt;? extends I\u0026gt;不兼容
■网友
使用强转public class Test { public static void main(String args) { System.out.println(TestEnum.A.toClass() == new ClassA().getClass()); }}enum TestEnum { A, B; public \u0026lt;T extends I\u0026gt; Class\u0026lt;T\u0026gt; toClass() { if (this == A) return (Class\u0026lt;T\u0026gt;) ClassA.class; else if (this == B) return (Class\u0026lt;T\u0026gt;) ClassB.class; else return null; }}interface I {}class ClassA implements I {}class ClassB implements I {}不知道这个是不是你想要的效果
推荐阅读
- 长寿花怎么养护?掌握两大方法,乖乖花开“爆盆”,花香四溢!
- 有啥方法,网站,项目可以自己练习计算广告学
- 直播会成为品牌传播的另一个途径么有哪些可行的方法感觉有戏又没头绪好捉急。
- |邳州市岔河镇探索创新工作方法以“三个凝聚”助力统战工作提质增效
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 小孩|手术矫正要20万,有什么可以不动手术的方法?小孩有点地包天
- 孩子|小孩发烧的处理方法有物理降温与药物退烧!但很多新手父母不会
- 中兴努比亚 Z5 的边框到底有多窄
- Java工程师和C++工程师在工作上有啥区别哪个更适合自身发展
- 捷径|学会这套方法,考试高分不难高考历史复习有“捷径”
