Java旧版不断发展
我最近偶然發(fā)現(xiàn)了JDK API的一個(gè)非常有趣的警告,即Class.getConstructors()方法。 它的方法簽名是這樣的:
有趣的是, Class.getConstructor(Class...)返回一個(gè)Constructor<T> ,并保持了<T> :
Constructor<T> getConstructor(Class<?>... parameterTypes)為什么會(huì)有區(qū)別,即為什么第一個(gè)方法不返回Constructor<T>[] ?
讓我們考慮一下Javadoc:
請(qǐng)注意,盡管此方法返回一個(gè)Constructor <T>對(duì)象的數(shù)組(也就是此類(lèi)的構(gòu)造函數(shù)的數(shù)組),但此方法的返回類(lèi)型為Constructor <?> [],而不是Constructor <T> []。預(yù)期。 這種信息量較少的返回類(lèi)型是必需的,因?yàn)閺拇朔椒ǚ祷睾?#xff0c;可以修改該數(shù)組以容納不同類(lèi)的Constructor對(duì)象,這將違反Constructor <T> []的類(lèi)型保證。
這是一個(gè)艱難的過(guò)程。 從歷史上看,這是怎么發(fā)生的:
Java 1.0 / Oak:數(shù)組
在Java 1.0( Oak編程語(yǔ)言的直接繼承者)中,已經(jīng)引入了數(shù)組。 實(shí)際上,它們是在Java 1.2中引入的collections API之前引入的。 數(shù)組遭受著我們今天所知道的所有問(wèn)題,包括它們的協(xié)變,這在運(yùn)行時(shí)導(dǎo)致了很多問(wèn)題,這些問(wèn)題在編譯時(shí)無(wú)法檢查:
Object[] objects = new String[1]; objects[0] = Integer.valueOf(1); // OuchJava 1.1:反射API
缺少“不錯(cuò)的” collection API, Class.getConstructors()方法唯一可能的返回類(lèi)型是Constructor[] 。 當(dāng)時(shí)的合理決定。 當(dāng)然,您可能會(huì)犯上述相同的錯(cuò)誤:
Object[] objects = String.class.getConstructors(); objects[0] = Integer.valueOf(1); // Ouch但是除了上述內(nèi)容之外,您還可以正確地編寫(xiě)以下代碼:
Constructor[] constructors = String.class.getConstructors(); constructors[0] = Object.class.getConstructor();// MuahahahahahahahaJava 1.2:Collections API
Java從很早的時(shí)候就一直向后兼容,甚至從Oak開(kāi)始。 到目前為止,在這個(gè)Stack Overflow問(wèn)題中,關(guān)于Oak的一些向后兼容性已泄漏到Java中,這是一個(gè)非常有趣的歷史研究。
雖然使用集合來(lái)設(shè)計(jì)反射API是很自然的,但是現(xiàn)在已經(jīng)為時(shí)已晚。 更好的解決方案可能是:
List getConstructors()但是,請(qǐng)注意,我們還沒(méi)有泛型,因此數(shù)組實(shí)際傳達(dá)的類(lèi)型信息比集合多。
Java 1.5:泛型
在Java 5中,
Constructor[] getConstructors()至
Constructor<?>[] getConstructors()已經(jīng)出于上述原因進(jìn)行了處理。 現(xiàn)在,使用集合的替代API肯定會(huì)更好:
List<Constructor<T>> getConstructors()但是船開(kāi)了。
Java,丑陋的疣
Java充滿(mǎn)了這些小警告。 它們都記錄在Javadocs中,并且經(jīng)常在Stack Overflow中記錄。 就在昨天,我們?cè)贛ap和ConcurrentHashMap記錄了與全新API相關(guān)的新警告 。
“管理權(quán):發(fā)人深省”,關(guān)于所有這些警告以及Brian Goetz維護(hù)這些警告的難易程度的很好演講可以在這里看到:
演講摘要:
語(yǔ)言設(shè)計(jì)師談?wù)撍麄冋谠O(shè)計(jì)的語(yǔ)言時(shí)
翻譯自: https://www.javacodegeeks.com/2015/03/the-java-legacy-is-constantly-growing.html
總結(jié)
以上是生活随笔為你收集整理的Java旧版不断发展的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑cpu水冷怎么更换(如何更换水冷)
- 下一篇: 带Lambda表达式的Apache Wi