如何使用非通用列表

时间:2014-03-24 14:36:17

标签: java list generics compatibility legacy

我必须使用旧的接口,使用裸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 ) { ... }

我应该明确转换/转换它们吗?

这里的最佳做法是什么?

3 个答案:

答案 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返回的任何集合 - 这里检查返回的对象类型是合适的。