我有一个允许3种类型的密封接口。
sealed interface Parent permits ChildA, ChildB, ChildC {}
record ChildA(long num) implements Parent {}
record ChildB(long num) implements Parent {}
record ChildC(long num) implements Parent {}
我想得到每种类型的构造函数,所以我尝试了以下方法。
Parent.class.getPermittedSubclasses();
但是,getPermittedSubclasses()
的返回类型是Class<?>
。为什么不是Class<? extends Parent>
?密封接口是一个全新的功能,没有任何依赖关系。那么,为什么要人为地限制返回类型,从而降低方法的可用性呢?
如果该方法返回Class<? extends Parent>
,我可以回过头来执行以下操作。
Class<? extends Parent> clazz = Parent.class.getPermittedSubclasses();
Class<Long> constructorParameter = Long.class;
Constructor<? extends Parent> constructor = clazz.getConstructor(constructorParameter);
Parent p = constructor.newInstance();
现在要明确的是,我可以通过执行@SuppressWarnings("unchecked")
来克服这一点,然后强行将值转换为我想要的值,但显然,这根本不理想。
事实上,这只是任意限制,我看不到任何好处。那么,有人能解释为什么会出现这种情况吗?
原因显然是对泛型数组的类型安全问题,请参阅JDK-8246278和引用的邮件列表帖子。
尽管可以说,这个决定是值得怀疑的,因为它牺牲了可用性来处理一个相当做作的角落案例(这很可能永远不会出现在常规代码中(
此外,还有其他现有的方法,如返回类型为TypeVariable<Class<T>>[]
的Class.getTypeParameters()
,也存在相同的(人为的(问题(也存在"不会修复"问题JDK-5063716(。