[英]Using generics “super” in implements/extends part of a class declaration
我有以下声明:
public interface Event<K> {}
public interface DataEvent<K, D> extends Event<K> {}
public interface OriginatedEvent<K, O> extends Event<K> {}
public class ErrorEvent<O, E extends Throwable> implements OriginatedEvent<Class<? extends ErrorEvent<O, E>>, O>, DataEvent<Class<? extends ErrorEvent<O, E>>, E> {}
public interface EventHandler<K, E extends Event<K>> {
public abstract class AbstractEventErrorHandler<O, E extends ErrorEvent<O, ? extends Throwable>> implements EventHandler<Class<E>, E> {}
我得到了: Bound mismatch: The type E is not a valid substitute for the bounded parameter <E extends Event<K>> of the type EventHandler<K,E>
最后一部分implements EventHandler<Class<E>, E> {}
如果更改: public abstract class AbstractEventErrorHandler<O, E extends ErrorEvent<O, ? extends Throwable>> implements EventHandler<Class<E>, E> {}
public abstract class AbstractEventErrorHandler<O, E extends ErrorEvent<O, ? extends Throwable>> implements EventHandler<Class<E>, E> {}
并: public interface EventHandler<K, E extends Event<? super K>>
public interface EventHandler<K, E extends Event<? super K>>
到: public abstract class AbstractEventErrorHandler<O, E extends ErrorEvent<O, ? super Throwable>> implements EventHandler<Class<E>, E> {}
public abstract class AbstractEventErrorHandler<O, E extends ErrorEvent<O, ? super Throwable>> implements EventHandler<Class<E>, E> {}
并: public interface EventHandler<K, E extends Event<K>>
它不再有错误(但稍后会出现其他问题,请参见下文)。 我试图找到有关此文档的文档,以更好地设计我的泛型,并理解为什么这样做,但是我找不到任何有用的方法,人们谈论在方法参数中使用extends / super或仅在类/接口签名中进行扩展,在类/接口签名中提到super只是说在声明的第一部分是不允许的。 就我而言,我不在签名的声明部分中使用它,而在继承部分中使用它。
我看了PECS吗? (生产者扩展,超级消费者),但这似乎对方法声明有效; 在类/接口中,可以稍后在代码中使用它。
有人可以解释一下或为我指出一个好的解释吗?
如果我像上面提到的那样更改它,然后尝试使用如下的AbstractEventErrorHandler类:
public abstract class AbstractEventBusErrorHandler extends AbstractEventErrorHandler<LocalEventBus, ErrorEvent<LocalEventBus, EventBusException>> {}
它给了我: Bound mismatch: The type ErrorEvent<LocalEventBus, EventBusException> is not a valid substitute for the bounded parameter <E extends ErrorEvent<O,? super Throwable>> of the type AbstractEventErrorHandler<O,E>?
Bound mismatch: The type ErrorEvent<LocalEventBus, EventBusException> is not a valid substitute for the bounded parameter <E extends ErrorEvent<O,? super Throwable>> of the type AbstractEventErrorHandler<O,E>?
谢谢
我认为您只是弄错了泛型类型。
代替
public abstract class AbstractEventErrorHandler< O, E extends ErrorEvent<O, ? extends Throwable>> implements EventHandler<Class<E>, E> {}
您可能要使用
public abstract class AbstractEventErrorHandler<O, E extends ErrorEvent<O, ? extends Throwable>> implements EventHandler<Class<O>, E> {}
问题是
EventHandler
期望第一个类型
Class<E>
是
ErrorEvent
的第一个类型,它是
Class<O>
,这是因为
ErrorEvent
实现了使用
Class<K>
的接口。
顺便说一句,您应该尝试为每种类型使用一个名称,即从
K
切换到
O
可能会引起一些混乱。
更新:
我重读了您的问题,我认为将代码复制到IDE进行测试时错过了一个定义。 所以报废上面。
我事实上,这似乎比上面更容易:
您声明了ErrorEvent
,以第一个包含通配符的类型实现OriginatedEvent
和DataEvent
: Class<? extends ErrorEvent<O, E>
Class<? extends ErrorEvent<O, E>
这些通配符总是解析为不同的类型,因此,当尝试在最后一行上解析implements EventHandler<Class<E>, E>
时,编译器会感到困惑( Class<E>
只能匹配其中一个通配符,因此另一个不匹配)不匹配)。
要解决此问题,您需要为通配符引入类型,例如:
public class ErrorEvent<O, E extends Throwable, K extends ErrorEvent<O, E, ?>> implements OriginatedEvent<Class<K>, O>, DataEvent<Class<K>, E> {}
然后在错误处理程序中,声明K
为E
:
public abstract class AbstractEventErrorHandler<O, E extends ErrorEvent<O, ? extends Throwable, E>> implements EventHandler<Class<E>, E> {}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.