我正在尝试将类型参数添加到旧API的类中。由于Java泛型的一个特性,我遇到了一个问题,似乎会导致很多客户端代码停止编译。
我有一个这样的类,我想添加一个类型参数:
class C {
List<String> getStrings() {
return Arrays.asList("dummy"); // Dummy implementation
}
Object getContent() {
// Dummy implementation. In reality an object of
// some specific type is returned.
return null;
}
}
请注意,getStrings
的返回值是已指定成员类型的列表。
在上传一个类型参数后,C
将如下所示:
class C<T> {
List<String> getStrings() {
return Arrays.asList("dummy");
}
T getContent() {
return null;
}
}
这就是问题所在。客户端使用类C
,如下所示:
class U {
static void m() {
// This compiles and works fine both before and after the
// type parameter is added.
C c = new C();
// ...
// This also compiles and works fine both before and after the
// type parameter is added.
Object cont = c.getContent();
// But this doesn't type check any more! Since c now has a raw type
// the return value of getStrings also has a raw type. So there
// will be a 'can't assign Object to String' error.
String s = c.getStrings().get(0);
}
}
对于客户来说,问题的解决方案很简单:只需向C
添加无界通配符类型:
C<?> c = new C<>();
但是这个API有很多外部客户端。如果使用C
的所有代码都必须更新(即使是以微不足道的方式)来进行编译,这将是一个很大的不便。
这有什么办法吗?有没有办法让我在类C
中添加一个类型参数,而不会破坏API的所有客户端的构建?
变通方法建议:您可以创建一个新类CV2
(可以扩展或不扩展现有类C
)提供新接口。
旧客户可以继续使用旧类,新客户可以使用新版本。当然,您将C
注释为已弃用。