Java 在不中断客户端代码的情况下添加类类型参数
我正在尝试向旧API的类添加类型参数。由于Java泛型的一个特性,我面临一个问题,这似乎会导致许多客户端代码停止编译 我有一个这样的类,我想在其中添加一个类型参数:Java 在不中断客户端代码的情况下添加类类型参数,java,generics,maintenance,raw-types,Java,Generics,Maintenance,Raw Types,我正在尝试向旧API的类添加类型参数。由于Java泛型的一个特性,我面临一个问题,这似乎会导致许多客户端代码停止编译 我有一个这样的类,我想在其中添加一个类型参数: class C { List<String> getStrings() { return Arrays.asList("dummy"); // Dummy implementation } Object getContent() { // Dummy implem
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;
}
}
问题来了。客户机使用类C
如下:
class C<T> {
List<String> getStrings() {
return Arrays.asList("dummy");
}
T getContent() {
return null;
}
}
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<>();
C=newc();
但是这个API有很多外部客户机。如果所有使用C
的代码都必须更新,即使是以一种微不足道的方式,使其能够编译,这将是一个很大的不便
是否有办法解决此问题?是否有办法在不破坏API中所有客户端的构建的情况下向类C
添加类型参数
例如,已经讨论了Java泛型的相同机制,但它们没有讨论解决方案和变通方法。变通方案:您可以创建一个新类
CV2
(可以扩展或不扩展现有类C
),以提供新接口
旧客户端可以继续使用旧类,新客户端使用新版本。当然,您将
C
注释为已弃用 嗯。。。我认为这将解决具体问题,代价是增加一个类使API复杂化。以及附加的重载方法,其中C
是一个参数,以获得类型参数的好处。嗯,对我来说绝对不值得。当然。你的观点有道理。也许你更应该考虑将你的API作为一个整体进行版本控制?!是的,像这样的东西可以帮助减轻客户的痛苦。我自己认为,懒惰的客户机应该只更新他们的代码,以获得新版本或API的好处。也许某种结构化版本控制方案有助于让更多的人以我的方式看待它……请注意,您的库更新只会影响客户端库中的新编译,现有的.class文件不受影响