2 回答
TA贡献2041条经验 获得超4个赞
对我来说,这看起来像糟糕的代码。我错了吗?
不,你没有看错。那里的示例混乱、不清楚,在运行时执行不必要的检查,并且无法在编译时检查任何类型安全性。
话虽如此:
什么是实现我的目标的优雅/干净的方式,即保持对指针的函数调用,但处理通用列表,同时无法调整 TypeA 或 TypeB 的定义?
...你不能。
Java 泛型是通过擦除实现的,因此泛型信息在运行时全部丢失(字节码中没有它的概念。)这意味着你不能有两个方法,它们的签名仅在它们的泛型类型上不同,就像 JVM 那样无法在运行时区分它们。
尽管您不情愿,但实现您所追求的目标的最简洁、最明显的方法就是放宽您对方法名称必须相同的要求。这几乎没有什么变化,可以为您提供编译时类型安全性和比上面的示例更清晰的代码。
您唯一的其他选择是创建一个非泛型子类,它List
实现您想要处理的每个泛型类型,并为每种类型使用不同的子类 - 但我真的看不到任何情况更可取。
TA贡献1836条经验 获得超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()。
添加回答
举报