从泛型推断类型

时间:2015-02-21 17:50:49

标签: java generics nested-generics

有没有办法推断对象O的类型,如下例所示(不会编译):

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

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

这是明确这样做的唯一方法:

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

我希望我的问题有道理。

1 个答案:

答案 0 :(得分:2)

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

  1. 如何声明LogUpdateListener ...
  2. 类型为S的{​​{1}}类型LogSet&#34;,...
  3. 其中O类型扩展O
  4. 然后,是的,您将其声明为:

    LogObject

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

    但是,你应该记住:

    • 表示LogObject类型,其中PP OP < O
    • LogSet<P> 不是 LogSet<O>
    • 的子类型

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