我必须使用旧的接口,使用裸List参数指定方法。
void updateParameter(List param1, List param2);
显然我需要用相同的签名来实现它们。
@Override
public void updateParameter(List param1, List param2) {
updateParam1( param1 );
updateParam2( param2 );
}
但新代码怎么样?我应该继续使用这些旧列表。新方法的签名是否应采用通用列表?
private void updateParam1( List<String> param1 ) { ... }
我应该明确转换/转换它们吗?
这里的最佳做法是什么?
答案 0 :(得分:4)
使用泛型编写新代码是正确的(考虑到泛型可用多久以后,切换早就应该了)。最明确的切换方法是弃用旧接口,定义新接口,在类中实现两个接口,使旧方法的所有实现都围绕新方法进行包装。这是一个假设updateParameter
是旧接口中唯一方法的示例:
interface OldInterface {
@Deprecated
void updateParameter(List param1, List param2);
}
interface NewInterface {
// Change the name
void updateParam(List<String> param1, List<String> param2);
}
class NewClass implements OldInterface, NewInterface {
public void updateParameter(List param1, List param2) {
updateParam((List<String>)param1, (List<String>)param2);
}
public void updateParam(List<String> param1, List<String> param2) {
... // The actual implementation goes here
}
}
随着时间的推移,您将能够摆脱旧界面。到那时,您需要做的就是删除已弃用的方法。
答案 1 :(得分:3)
我个人坚持“不要让缺陷传递下去”的理念。在某个地方,必须发生不安全的类型转换(即使它是由编译器在引擎盖下完成的)。为什么不尽早做呢?这样,下游的代码可以是干净的,您只能在一个地方遇到问题,而不是分散在整个代码库中。这也遵循“快速失败”的原则。
@Override
public void updateParameter(List param1, List param2) {
List<String> param1TypeSafe = (List<String>)param1;
List<String> param2TypeSafe = (List<String>)param2;
updateParam1( param1TypeSafe );
updateParam2( param2TypeSafe );
//now nowhere else in the codebase needs to deal with it.
}
答案 2 :(得分:1)
Java中的泛型被设计为向后兼容。所以,你可以传递List&lt;字符串&gt;和列表&lt;整数&gt;将对象作为旧方法的参数。您不必明确地投射它们。
最佳实践 - 在所有新代码中使用泛型以增加类型安全性。如果您被迫插入遗留代码,只需将它们作为参数传递而不进行任何转换。您必须小心处理从遗留API返回的任何集合 - 这里检查返回的对象类型是合适的。