第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

Java 泛型:使用一個(gè)函數(shù)簽名處理兩種泛型類型的簡潔方法

Java 泛型:使用一個(gè)函數(shù)簽名處理兩種泛型類型的簡潔方法

函數(shù)式編程 2023-05-24 15:30:27
有一個(gè)Utilities提供公共靜態(tài)函數(shù)的類,用于進(jìn)行通用數(shù)據(jù)處理。該類主要用于創(chuàng)建FloatPointer要在本機(jī)代碼中使用的 s。該類如下所示:class Utilities{    private Utilities(){}    static FloatPointer toPointer( List< TypeA > list )    {        // do some magic        return p    }    static FloatPointer toPointer( List< TypeB > list )    {        // do some different magic        return p    }}這個(gè)問題很明顯。因?yàn)榫幾g器將這些簽名解析為FloatPointer toPointer( List list )擦除問題,所以不能這樣定義這些函數(shù)。現(xiàn)在我問自己,實(shí)現(xiàn)這個(gè)的最干凈的方法是什么。首先,我非常想堅(jiān)持使用名稱toPointer而不是使用不同的函數(shù)名稱。這是因?yàn)樵谡鎸?shí)的類中有一大堆toPointer處理各種類型的函數(shù)。引入一個(gè)新名稱會破壞計(jì)劃,因?yàn)閳F(tuán)隊(duì)中的其他開發(fā)人員已經(jīng)習(xí)慣了toPointer這不是一個(gè)好主意。我可以想象有兩個(gè)函數(shù)private static typeAToPointer( List< TypeA > list )and private static typeBToPointer( List< TypeB > list ),但這兩個(gè)函數(shù)需要從公共toPointer函數(shù)調(diào)用,以免破壞函數(shù)名稱的方案。遺憾的是我們沒有實(shí)現(xiàn)TypeAor TypeB,所以我不能讓兩者實(shí)現(xiàn)一個(gè)公共接口并接受它——一般來說我不能以任何方式改變TypeAor TypeB。目前我傾向于實(shí)現(xiàn)一個(gè)函數(shù)接受一個(gè)List< T >并簡單地檢查類型,然后處理它。這個(gè)例程看起來像這樣:static < T > FloatPointer toPointer( List< T > list ){    Class clazz;    if( !list.isEmpty() ) clazz = list.get( 0 ).getClass();    else throw new IllegalArgumentException( "Empty list will result in NP." );    if( clazz == TypeA.class ) return typeAToPointer( list );    else if( clazz == TypeB.class ) return typeBToPointer( list );    else throw new IllegalArgumentException( "List entries of invalid type." );}對我來說,這看起來像糟糕的代碼。我錯了嗎?什么是實(shí)現(xiàn)我的目標(biāo)的優(yōu)雅/干凈的方式,即保持函數(shù)調(diào)用toPointer,但處理通用列表,同時(shí)無法調(diào)整TypeAor的定義TypeB?
查看完整描述

2 回答

?
縹緲止盈

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊

對我來說,這看起來像糟糕的代碼。我錯了嗎?

不,你沒有看錯。那里的示例混亂、不清楚,在運(yùn)行時(shí)執(zhí)行不必要的檢查,并且無法在編譯時(shí)檢查任何類型安全性。

話雖如此:

什么是實(shí)現(xiàn)我的目標(biāo)的優(yōu)雅/干凈的方式,即保持對指針的函數(shù)調(diào)用,但處理通用列表,同時(shí)無法調(diào)整 TypeA 或 TypeB 的定義?

...你不能。

Java 泛型是通過擦除實(shí)現(xiàn)的,因此泛型信息在運(yùn)行時(shí)全部丟失(字節(jié)碼中沒有它的概念。)這意味著你不能有兩個(gè)方法,它們的簽名僅在它們的泛型類型上不同,就像 JVM 那樣無法在運(yùn)行時(shí)區(qū)分它們。

盡管您不情愿,但實(shí)現(xiàn)您所追求的目標(biāo)的最簡潔、最明顯的方法就是放寬您對方法名稱必須相同的要求。這幾乎沒有什么變化,可以為您提供編譯時(shí)類型安全性和比上面的示例更清晰的代碼。

您唯一的其他選擇是創(chuàng)建一個(gè)非泛型子類,它List實(shí)現(xiàn)您想要處理的每個(gè)泛型類型,并為每種類型使用不同的子類 - 但我真的看不到任何情況更可取。


查看完整回答
反對 回復(fù) 2023-05-24
?
米脂

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊

你可以這樣做:


static FloatPointer typeAToPointer( List< TypeA > list )

{

? ? return toPointer( list, objectOfTypeA -> /*parse to FloatPointer*/ );

}


static FloatPointer typeBToPointer( List< TypeB > list )

{

? ? return toPointer( list, objectOfTypeB -> /*parse to FloatPointer*/ );

}


static < T > FloatPointer toPointer( List< T > list, Function< T, FloatPointer > parser ) {

? ?//do some common code here

? ?T object = /* extract object from list*/

? ?FloatPointer pointer = parser.apply( object );

? ?//do some other common code on pointer?

? ?return pointer ;

}

這里有一個(gè) toPointer 模板方法,它使用Function< T, FloatPointer > 解析器將某種類型 T 的對象映射到 FloatPinter。它的映射方式在具體的 toPointer( List< TypeA > list ) 方法中指定。例如,objectOfTypeA -> / parse to FloatPointer / 可能只是 objectOfTypeA -> objectOfTypeA.getFloatPointer()。

查看完整回答
反對 回復(fù) 2023-05-24
  • 2 回答
  • 0 關(guān)注
  • 232 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號