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è)泛型類型,并為每種類型使用不同的子類 - 但我真的看不到任何情況更可取。

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()。
添加回答
舉報(bào)