为什么 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。
我有一个允许 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。