Java泛型声明<A extends X & Y & Z>中X、Y、Z的正确类型假设是什么
问题结论
你看到的是Java泛型的多上界约束语法,X、Y、Z的类型需要符合Java的单继承规则,具体要求如下:
- 多边界列表里最多只能存在1个普通类,且这个类必须放在边界列表的第一个位置(也就是这里的X可以是类,也可以是接口)
- 除了第一个位置的边界外,后续所有的边界(这里的Y、Z)必须全部是Java接口,不能是普通类
- 如果X是接口,那么整个边界列表里的所有类型都必须是接口,不能再出现任何普通类
规则依据
Java是单继承语言,任何一个类最多只能继承一个父类,但是可以实现任意数量的接口,泛型的边界约束完全对齐了Java的类继承规则:当你给泛型参数指定多个上界时,相当于要求传入的类型必须同时是所有这些上界的子类/实现类,自然不能要求一个类继承多个父类,所以多边界里最多只能有一个类,且必须放在最前面。
合法示例
// 第一个边界是类ArrayList,后续两个是接口,符合要求 public class G<A extends ArrayList & Serializable & Cloneable>
非法示例
// 错误:第二个边界是类,不允许多个类作为边界 public class G<A extends Serializable & ArrayList> // 错误:多个类作为边界,违反单继承规则 public class G<A extends ArrayList & LinkedList>
疑问直接解答
X、Y、Z不一定全都是接口,合法的情况只有两种:
- X是普通类,Y、Z都是接口
- X、Y、Z全都是接口
如果三者全都是普通类,这段代码必然编译失败。
内容的提问来源于stack exchange,提问作者treeoid
相关产品推荐
相关产品推荐

