为什么 Class.getPermittedSubclasses() return Class<?>[] 而不是 Class<?延伸 T>[]

Why does Class.getPermittedSubclasses() return Class<?>[] and not Class<? extends 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()的return类型是Class<?>。为什么不是 Class<? extends Parent>?密封接口是一个全新的特性,没有任何依赖。那么,为什么要人为地限制 return 类型,从而降低该方法的可用性?

如果方法 returned 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 and the referenced mailing list post

虽然可以说这个决定是相当值得怀疑的,因为它牺牲了一个相当人为的角落案例的可用性(这很可能永远不会出现在常规代码中)。
此外,还有其他现有方法,例如 Class.getTypeParameters() with return type TypeVariable<Class<T>>[] which suffer from the same (contrived) issue (there also exists the "Won't Fix" issue JDK-5063716