gpt4 book ai didi

java - 添加类类型参数而不破坏客户端代码

转载 作者:行者123 更新时间:2023-11-30 06:51:05 29 4
gpt4 key购买 nike

我正在尝试向旧 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的代码都必须更新(即使是以一种微不足道的方式)才能编译,那将是一个很大的不便。

有办法解决这个问题吗?有没有办法可以在不破坏 API 的所有客户端构建的情况下向类 C 添加类型参数?

Java 泛型的相同机制已经被讨论过,例如 here , herehere ,但他们没有讨论解决方案和变通办法。

最佳答案

解决方法建议:您可以创建一个提供新接口(interface)的新类CV2(可以扩展或不扩展现有类C)。

老客户端可以继续使用旧版本,新客户端使用新版本。当然,您将 C 注释为已弃用。

关于java - 添加类类型参数而不破坏客户端代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42748943/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com