繁体   English   中英

在实现/扩展类声明的一部分中使用泛型“ super”

[英]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 ,以第一个包含通配符的类型实现OriginatedEventDataEventClass<? 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> {} 

然后在错误处理程序中,声明KE

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM