[英]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.