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

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

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

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

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

2 回答

?
縹緲止盈

TA貢獻2041條經(jīng)驗 獲得超4個贊

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

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

話雖如此:

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

...你不能。

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

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

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


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

TA貢獻1836條經(jīng)驗 獲得超3個贊

你可以這樣做:


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 ;

}

這里有一個 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)注
  • 241 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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