从泛型推断类型
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>>
我希望我的问题有道理。
我不确定我是否理解你的问题,但如果你问:
- 如何声明
LogUpdateListener
...
- 类型
S
扩展了“LogSet
类型 O
”,...
- 其中类型
O
扩展 LogObject
?
那么,是的,您将其声明为:
public interface LogUpdateListener<O extends LogObject, S extends LogSet<O>>
这是因为如果O
是一个类型参数(我想你是这么说的),那么你需要在类型参数部分声明它。如果您还想将 O
绑定为 LogObject
的子类型,则需要将绑定与类型参数声明一起添加。
但是,您应该记住:
- 对于类型
P
,其中 P
是 O
的 proper subtype (P < O
)
LogSet<P>
不是 LogSet<O>
的子类型
这可能意味着您需要在方法声明中使用 LogSet<? extends O>
或 LogSet<? super O>
的通配符参数化类型,例如,如果您想复制 from/to(按此顺序)其他 LogSet
个对象。
是否有任何方法可以推断对象 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>>
我希望我的问题有道理。
我不确定我是否理解你的问题,但如果你问:
- 如何声明
LogUpdateListener
... - 类型
S
扩展了“LogSet
类型O
”,... - 其中类型
O
扩展LogObject
?
那么,是的,您将其声明为:
public interface LogUpdateListener<O extends LogObject, S extends LogSet<O>>
这是因为如果O
是一个类型参数(我想你是这么说的),那么你需要在类型参数部分声明它。如果您还想将 O
绑定为 LogObject
的子类型,则需要将绑定与类型参数声明一起添加。
但是,您应该记住:
- 对于类型
P
,其中P
是O
的 proper subtype (P < O
) LogSet<P>
不是LogSet<O>
的子类型
这可能意味着您需要在方法声明中使用 LogSet<? extends O>
或 LogSet<? super O>
的通配符参数化类型,例如,如果您想复制 from/to(按此顺序)其他 LogSet
个对象。