【发布时间】:2019-08-08 23:15:34
【问题描述】:
有一个类Utilities 提供公共静态函数,用于进行通用数据处理。该类主要用于创建FloatPointers 用于native code。
类如下所示:
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 ),所以我遇到了擦除问题,所以这些函数不能这样定义。
现在我问自己,实现这一点的最干净的方法是什么。
首先,我非常想坚持使用名称toPointer,而不是使用不同的函数名称。这是因为在真正的类中有一大堆toPointer 函数处理各种类型。引入新名称会破坏计划,因为团队中的其他开发人员习惯于toPointer,这不是一个好主意。
我可以想象有两个函数 private static typeAToPointer( List< TypeA > list ) 和 private static typeBToPointer( List< TypeB > list ),但这两个函数需要从公共 toPointer 函数中调用,以免破坏函数名称的方案。
遗憾的是,我们没有实现TypeA 或TypeB,所以我不能让这两者实现一个通用接口并接受这一点——通常我不能以任何方式更改TypeA 或TypeB。
目前我倾向于实现一个接受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." );
}
对我来说,这看起来像是糟糕的代码。我错了吗?什么是实现我的目标的优雅/干净的方式,即保持函数调用toPointer,但处理任一通用列表,同时无法调整TypeA或@的定义987654339@?
【问题讨论】:
-
你需要做的“魔法”是什么?两者是否相同(ish)?
-
“对我来说,这看起来像糟糕的代码。我弄错了吗?”你的判断是正确的。
-
是与否,代码是 samish,但是这两种类型确实有不同的公共功能,我需要使用它们。遗憾的是,我不能接受通用类型
T,然后以同样的方式处理它。必须区分。 -
请展示魔法。答案的形式取决于它实际需要做什么。
-
我知道这不是你要找的,但我能看到的最干净的方法是 Java 只是更改方法名称而不是重载。我知道这不是理想,但它肯定比你那里的
toPointer()示例干净得多,并且还保持了泛型类型的安全性。