有一个Utilities提供公共静态函数的类,用于进行通用数据处理。该类主要用于创建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 )擦除问题,所以不能这样定义这些函数。
现在我问自己,实现这个的最干净的方法是什么。
首先,我非常想坚持使用名称toPointer而不是使用不同的函数名称。这是因为在真实的类中有一大堆toPointer处理各种类型的函数。引入一个新名称会破坏计划,因为团队中的其他开发人员已经习惯了toPointer这不是一个好主意。
我可以想象有两个函数private static typeAToPointer( List< TypeA > list )and private static typeBToPointer( List< TypeB > list ),但这两个函数需要从公共toPointer函数调用,以免破坏函数名称的方案。
遗憾的是我们没有实现TypeAor TypeB,所以我不能让两者实现一个公共接口并接受它——一般来说我不能以任何方式改变TypeAor 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,但处理通用列表,同时无法调整TypeAor的定义TypeB?
缥缈止盈
米脂
相关分类