转载自https://www.oschina.net/question/2847805_2196069中大止刀口的答案
java 的 通配 ? super和? extends实际上是对叫括号内要代表的类型的限定,用于类型推导。
而不能简单的认为把类型代入?后成立就可以,而是要类型推导符合才行。
Java泛型这样的设计就造成了需要具体场景下的类型分析推导才能分辨是否可行,这就很不直观。
这里主要说下 返回类型和参数类型。
void method(? super C);//参数是C的超类,只要是C的子类传进来都能确认没问题。
void method(? extends C);//参数是C的子类,不能确定C的子类究竟是哪一个,传什么都不对。
? super C method();//返回值是C的超类,不能确定C的超类是具体哪一个,只能确定是Object。
? extends C method();//返回值是C的子类,至少可以确定类型是C及其父类。