修改接口中的泛型如何影响向后兼容性

How does modifying generics in interface affect backwards compatibility

我有这样的界面,

public interface EventListener<T extends Event>

这里的问题是 EventListener 是一个非常通用的名称(也可以说是 Event)并且 class Event 没有写成通用方式。

由于我们不允许进行非向后兼容的更改,因此计划将接口的通用部分修改得更通用。所以基本上我有两个选择。或者,

a) 添加一个超级接口(例如GeneralEventListener,让我们现在不介意这个名字)可以无差别地采用泛型

public interface GeneralEventListener<T>

b) 允许EventListener接受类型为T的对象。

public interface EventListener<T>

我确定第一个是允许的修改。然而,这似乎是一个不必要的复杂化,它会污染命名空间。除了以前的信息性之外,没有必要保留对 Event 的限制。所以我想知道,"is the change (b) binary backwards compatible"?

我之前的回答并不完全正确。

这会导致问题。由于您使用的是有界类型,编译器会将类型参数替换为有界类型。

看看:https://docs.oracle.com/javase/tutorial/java/generics/erasure.html

当然,因为泛型是在编译时使用的,所以最好的办法就是进行更改并查看代码是否可以编译。