日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

方法参数泛型_无参数泛型方法反模式

發(fā)布時(shí)間:2023/12/3 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 方法参数泛型_无参数泛型方法反模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

方法參數(shù)泛型

最近,有關(guān)Java泛型的一個(gè)非常有趣的問(wèn)題發(fā)布到Stack Overflow和reddit上。 請(qǐng)考慮以下方法:

<X extends CharSequence> X getCharSequence() {return (X) "hello"; }

盡管這種不安全的轉(zhuǎn)換看起來(lái)有些古怪,并且您可能會(huì)猜這里有些問(wèn)題,但是您仍然可以繼續(xù)并在Java 8中編譯以下賦值:

Integer x = getCharSequence();

這顯然是錯(cuò)誤的,因?yàn)镮nteger是final ,因此沒(méi)有可能也可以實(shí)現(xiàn)CharSequence Integer子類(lèi)型。 但是,Java的泛型類(lèi)型系統(tǒng)并不關(guān)心類(lèi)是否為final final,因此,在將交集類(lèi)型轉(zhuǎn)換回Integer之前,它會(huì)推斷X的交集類(lèi)型Integer & CharSequence 。 從編譯器的角度來(lái)看,一切都很好。 在運(yùn)行時(shí): ClassCastException

盡管上面的內(nèi)容“顯然是可疑的”,但真正的問(wèn)題出在其他地方。

(幾乎)永遠(yuǎn)不會(huì)使方法僅在返回類(lèi)型上通用

此規(guī)則有例外。 這些異常是類(lèi)似的方法:

class Collections {public static <T> List<T> emptyList() { ... } }

此方法沒(méi)有參數(shù),但返回通用List<T> 。 無(wú)論<T>的具體推論如何,為什么都能保證正確性? 由于其語(yǔ)義。 無(wú)論您要查找的是一個(gè)空的List<String>還是一個(gè)空的List<Integer> ,由于是空的(并且是不可變的!)語(yǔ)義,盡管擦除,都可以為這些T中的任何一個(gè)提供相同的實(shí)現(xiàn)。

另一個(gè)例外是構(gòu)建器,例如javax.persistence.criteria.CriteriaBuilder.Coalesce< ,它是通過(guò)通用的無(wú)參數(shù)方法創(chuàng)建的:

<T> Coalesce<T> coalesce();

生成器方法是最初構(gòu)造空對(duì)象的方法。 空虛是關(guān)鍵。

但是,對(duì)于大多數(shù)其他方法,這是不正確的,包括上述的getCharSequence()方法。 此方法唯一保證的正確返回值是null 。

<X extends CharSequence> X getCharSequence() {return null; }

…因?yàn)樵贘ava中, null是可以分配(和強(qiáng)制轉(zhuǎn)換)給任何引用類(lèi)型的值。 但這不是該方法作者的意圖。

考慮函數(shù)式編程

方法是函數(shù)(大部分是函數(shù)),因此,預(yù)期不會(huì)有任何副作用。 無(wú)參數(shù)函數(shù)應(yīng)始終返回完全相同的返回值。 就像emptyList()一樣。

但是實(shí)際上,這些方法并不是沒(méi)有參數(shù)的。 它們確實(shí)具有類(lèi)型參數(shù)<T>或<X extendds CharSequence> 。 同樣,由于泛型類(lèi)型擦除,此參數(shù)在Java中“并未真正計(jì)數(shù)”,因?yàn)槿狈σ?guī)范化,因此無(wú)法從方法/函數(shù)內(nèi)部進(jìn)行自省。

因此,請(qǐng)記住以下幾點(diǎn):

(幾乎)永遠(yuǎn)不會(huì)使方法僅在返回類(lèi)型上通用

最重要的是,如果您的用例只是為了避免Java 5之前的版本轉(zhuǎn)換,例如:

Integer integer = (Integer) getCharSequence();

是否想在您的代碼中找到令人討厭的方法?

我正在使用番石榴來(lái)掃描類(lèi)路徑,您可能還會(huì)使用其他東西。 此代碼段將在類(lèi)路徑上生成所有通用的無(wú)參數(shù)方法:

import java.lang.reflect.Method; import java.util.Comparator; import java.util.stream.Stream;import com.google.common.reflect.ClassPath;public class Scanner {public static void main(String[] args) throws Exception {ClassPath.from(Thread.currentThread().getContextClassLoader()).getTopLevelClasses().stream().filter(info -> !info.getPackageName().startsWith("slick")&& !info.getPackageName().startsWith("scala")).flatMap(info -> {try {return Stream.of(info.load());}catch (Throwable ignore) {return Stream.empty();}}).flatMap(c -> {try {return Stream.of(c.getMethods());}catch (Throwable ignore) {return Stream.<Method> of();}}).filter(m -> m.getTypeParameters().length > 0 && m.getParameterCount() == 0).sorted(Comparator.comparing(Method::toString)).map(Method::toGenericString).forEach(System.out::println);} }

翻譯自: https://www.javacodegeeks.com/2016/04/parameterless-generic-method-antipattern.html

方法參數(shù)泛型

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的方法参数泛型_无参数泛型方法反模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。