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

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