修改接口中的泛型如何影响向后兼容性
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
当然,因为泛型是在编译时使用的,所以最好的办法就是进行更改并查看代码是否可以编译。
我有这样的界面,
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
当然,因为泛型是在编译时使用的,所以最好的办法就是进行更改并查看代码是否可以编译。