在Wikipedia关于共同和违反的文章中,有一个示例用例,然后是一个解释性句子,描述了类型声明的含义。我发现这非常有用。阅读了几次说明后,我觉得我理解了它的话。
<T extends Comparable<? super T>> T max(Collection<T> coll);
有限的通配符
? super T
传达了max
仅在可比较界面中调用contravariant方法的信息。
有人可以用类似的语言解释, java.util.function.Consumer
@FunctionalInterface
中 andThen()
函数上的类型声明意味着:
public interface Consumer<T> {
void accept(T t);
default Consumer<T> andThen(Consumer<? super T> after) {
,例如
有限的通配符
的信息? super T
传达了andThen
....?
我有一个次要问题:我该如何找出自己,这种类型的声明意味着什么?例如。在上面的第一个示例中,java.util.Collections
UTIL类:类-t的类型范围如何能够传达有关T的方法的信息?有人可以用Java语言规范指出我的相关段落吗?
可能回答第一个问题:
public interface Consumer<T> {
void accept(T t);
default Consumer<T> andThen(Consumer<? super T> after) {
有限的通配符
? super T
传达了andThen
带来T
消费者或T
的超级型的信息。 contravariant 消费者,作为参数。
可能的答案:https://stackoverflow.com/a/2501513
基本上 - 完全独立于通用(!) - 方法返回类型本质上是 "协变"(假定为"生产者")。如果在子类中覆盖方法,您始终可以声明更具体的退货类型。
方法参数当然也是"协变" - 您只能传递比方法签名指定的更具体的对象。但是在子类方面,尽管从技术上讲该方法并不是非参数论点的过度 - 遵守liskov_substitution_principle-通常是有意义的,在儿童类中宣布"违反"参数类型,如果名称和其他参数相等 - "父类中的方法。然后,"静态"(参考类型)方法调度将确保(不太具体的)儿童方法称为获胜。假定方法参数被"消耗",然后使用PEC。无论如何,对于通用参数,桥梁方法是生成的,并且都更加毛茸茸。但是我们会到达那里。