0

有什么方法可以推断出对象 O 的类型,如下例所示(不会编译):

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

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

是像这样明确地做到这一点的唯一方法:

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

我希望我的问题是有道理的。

4

1 回答 1

2

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

  1. 如何申报LogUpdateListener...
  2. S扩展“LogSet类型”的类型,O...
  3. 类型在哪里O扩展LogObject

然后,是的,您将其声明为:

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

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

但是,您应该记住:

  • 对于一个类型P,其中P是( )的正确子类型OP < O
  • LogSet<P> 不是的子类型LogSet<O>

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

于 2015-02-21T17:54:35.333 回答