为什么 Class.getPermittedSubclasses() 返回 Class<?>[] 而不是 Class<? 扩展 T>[]



我有一个允许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(。

相关内容

最新更新