我有这样的界面,

public interface EventListener<T extends Event>


这里的问题是EventListener是一个非常通用的名称(也可以用Event来称呼),而类Event却不是以通用的方式编写的。

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

a)添加一个超级接口(例如,GeneralEventListener,现在不介意现在使用的名称)

public interface GeneralEventListener<T>


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

public interface EventListener<T>


我确信第一个是允许的修改。但是,这似乎是不必要的复杂化,并且会污染名称空间。除了以前提供的信息外,没有必要保留对Event的限制。所以我想知道“更改(b)二进制向后兼容”吗?

最佳答案

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

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

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

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

10-08 00:06