簡體   English   中英

為什么 Class.getPermittedSubclasses() 返回 Class<!--?--> [] 而不是 Class<!--? extends 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()的返回類型是Class<?> 為什么不是Class<? extends Parent> Class<? extends Parent> 密封接口是一個全新的特性,沒有任何依賴。 那么,為什么要人為地限制返回類型以降低方法的可用性呢?

如果方法返回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")來解決這個問題,然后將值強制轉換為我想要的值,但顯然,這根本不是理想的。

事實上,這只是任意限制,我看不到任何好處。 那么有人可以解釋為什么會這樣嗎?

這樣做的原因顯然是關於泛型 arrays 的類型安全問題,請參閱JDK-8246278和引用的郵件列表帖子

雖然可以說這個決定是相當值得懷疑的,因為它犧牲了一個相當人為的極端情況的可用性(這很可能永遠不會出現在常規代碼中)。
此外,還有其他現有方法,例如返回類型為TypeVariable<Class<T>>[]Class.getTypeParameters()存在相同(人為的)問題(也存在“Won't Fix”問題JDK-5063716這個)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM