? 超字符串下界Java

? 超字符串下界Java,java,generics,bounded-wildcard,lower-bound,Java,Generics,Bounded Wildcard,Lower Bound,我正在读作者珍妮·博亚尔斯基和斯科特·塞利科夫为OCP写的书,书上写着:第122页 ? super String 对于下限,我们告诉Java,该列表将是字符串对象的列表或 作为字符串超类的某些对象的列表 List<? super String> superString = new ArrayList<>(); superString.add(new String());// Valid superString.add(new Object())

我正在读作者珍妮·博亚尔斯基和斯科特·塞利科夫为OCP写的书,书上写着:第122页

? super String
对于下限,我们告诉Java,该列表将是字符串对象的列表或 作为字符串超类的某些对象的列表

    List<? super String> superString = new ArrayList<>();
    superString.add(new String());// Valid 
    superString.add(new Object()); // Not Valid ? Why?. Object is a super class of String 
List<? super IOException> exceptions = new ArrayList<IOException>();

List您需要了解,这些边界(上下限)用于限制/指定变量的类型,而不是用于限制/指定此类集合中元素的类型

例如:

List<? super String> variable = new ArrayList<CharSequence>();

List这里有一个链接,指向一个好的解释

这本书是正确的?“超级字符串”意味着列表可能包含字符串或字符串的超类型(例如Object、CharSequence)

在你的例子中:

List<? super String> superString = new ArrayList<>();
    superString.add(new String());// 1 
    superString.add(new Object()); // 2
您可能有以下情况:

List<? super MyInterfaceImpl> myList = new ArrayList<MyInterfaceImpl>();

例如,您可以获得一个值列表。元素类型是Object,不能保证更具体的类型。例如,这里您需要字符串,但得到一个
列表换句话说:可以给变量分配一个超类型(String、CharSequence、Object)的列表,编译器只能知道字符串可以安全地放在列表中。
List@ShahidGhafoor无效,,因为您可以像这样初始化变量:
ListRelated:
?“超级字符串”表示列表可能包含字符串或字符串的超类型(如Object、CharSequence)
请给出
中的完整示例?超级字符串
同时包含字符串和超类型对象。bcz答案对我来说仍然不清楚..谢谢
List<? super String> superString = new ArrayList<>();
    superString.add(new String());// 1 
    superString.add(new Object()); // 2
List<? super String> list = new ArrayList<Object>();
list.add("String");
List<? super String> list = new ArrayList<String>();
list.add(new Object());
interface MyInterface {

}

class MyInterfaceImpl implements MyInterface {

}

class MyInterfaceImplExtra extends MyInterfaceImpl {

}
List<? super MyInterfaceImpl> myList = new ArrayList<MyInterfaceImpl>();
myList.add(new MyInterface(){}); // - compile error "not applicable for the arguments"
myList.add(new MyInterfaceImpl()); // - works fine
myList.add(new MyInterfaceImplExtra()); // - works fine
List<String> result = (List<String>) getList();
 System.out.println(result.get(0));

 public static List<? super String> getList(){
    List<Object> list = new ArrayList<Object>();
    list.add(new Object());
    return list;
 }
Stream<T> filter(Predicate<? super T> predicate);
List<Person> list = new ArrayList<Person>() {{
        add(new Person("John"));
        add(new Person("Max"));
        add(new Person("Megan"));
    }};

list.stream().filter((Employee e) -> e.getId().startsWith("1")); // compile error