Java泛型超级/扩展-不同的行为(用于OCP Java 8研究目的)

Java泛型超级/扩展-不同的行为(用于OCP Java 8研究目的),java,generics,lambda,extends,super,Java,Generics,Lambda,Extends,Super,假设我有以下结构: java.lang.Object class A extends Object { public boolean mA() {return true;} } class B extends A { public boolean mB() {return false;} } 现在我正在写一个使用它的主要方法。 我对以下概念很满意:('Object'类型从super的get方法返回) publicstaticvoidm1(ListThe,讨论lambda表达式的类型推断。其中一

假设我有以下结构:

java.lang.Object
class A extends Object { public boolean mA() {return true;} }
class B extends A { public boolean mB() {return false;} }
现在我正在写一个使用它的主要方法。 我对以下概念很满意:('Object'类型从super的get方法返回)

publicstaticvoidm1(ListThe,讨论lambda表达式的类型推断。其中一节讨论存在通配符和边界时的类型推断


当通用函数接口由通配符参数化时,有许多不同的实例化可以满足通配符的要求并产生不同的函数类型。例如,
谓词
(函数类型
整数
->
布尔
),
谓词
(函数类型
Number
->
boolean
),和
谓词
(函数类型
对象
->
boolean
)是一个
谓词
,那么
对象
必须是推断类型。在这里,你会得到编译器错误,关于
mA
没有在
对象
上定义好问题!我从来没有注意到这一点,但它看起来真的很有趣!我希望能帮上忙,但我对Java中的genetics实现知之甚少。但是要意识到泛型都是编译时的,它们在字节码生成过程中被简化为对象。泛型只是为了方便程序员使用。它不能是
对象,因为您正在调用
mA()
。试着调用
toString()
看看你得到了什么。这基本上是核心。我认为这也可能是相关的,但是……这已经足够让人难以理解了。谢谢@rgetman。当你提到“可分配”部分时,我觉得很有意义。这里的代码格式标签对我不起作用,所以我将添加一些其他行,用于测试你的an回答问题部分,加上我在研究更多问题时发现的有趣语法。
public static void m1(List<? super A> l ) {
    l.get(0).toString();
}
m1(new ArrayList<A>());
m1(new ArrayList<Object>());
public static void m2(List<? extends A> l ) {
    l.get(0).mA();
}
m2(new ArrayList<A>());
m2(new ArrayList<B>());
Predicate<? extends A> p1 = a -> a.mA(); // ok
Predicate<? super A> p2 = a -> a.mA(); // why is it of type 'A' too??
PredicateImpl<T super A> {
    public boolean test(T t);
}
Predicate<? super A> pSuper = a -> a.mA();
Predicate<? extends A> pExtends = a -> a.mA();      // ?? A ??

Predicate<Object> pObject = o -> o.equals(null);
Predicate<A> pA = a -> a.mA();
Predicate<B> pB = b -> b.mB();

pSuper = pObject;
pSuper = pA;
pSuper = pB;        // compiler error

pExtends = pObject; // compiler error
pExtends = pA;
pExtends = pB;
Predicate<? extends A> pExtends2 = (B b) -> b.mB();