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

我正在尝试向旧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; 
    }
}
问题来了。客户机使用类
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文件不受影响