从泛型推断类型

Inferring type from generic

是否有任何方法可以推断对象 O 的类型,如下面的示例(无法编译):

public interface LogUpdateListener<S extends LogSet<O>> {
    void logUpdated(O object);
}

所以在上面的示例中,LogSet 是通用的,在 O extends LogObject 中采用 O。如果 S extends LogSet,那么使用 S 是否可以推断出 O 的类型以用作 logUpdated 方法的类型?

是像这样明确执行此操作的唯一方法:

public interface LogUpdateListener<O extends LogObject, S extends LogSet<O>>

我希望我的问题有道理。

我不确定我是否理解你的问题,但如果你问:

  1. 如何声明 LogUpdateListener ...
  2. 类型 S 扩展了“LogSet 类型 O”,...
  3. 其中类型 O 扩展 LogObject?

那么,是的,您将其声明为:

public interface LogUpdateListener<O extends LogObject, S extends LogSet<O>>

这是因为如果O是一个类型参数(我想你是这么说的),那么你需要在类型参数部分声明它。如果您还想将 O 绑定为 LogObject 的子类型,则需要将绑定与类型参数声明一起添加。

但是,您应该记住:

  • 对于类型 P,其中 POproper subtype (P < O)
  • LogSet<P> 不是 LogSet<O>
  • 的子类型

这可能意味着您需要在方法声明中使用 LogSet<? extends O>LogSet<? super O> 的通配符参数化类型,例如,如果您想复制 from/to(按此顺序)其他 LogSet 个对象。