下限通配符Java-访问方法

下限通配符Java-访问方法,java,generics,wildcard,java-stream,Java,Generics,Wildcard,Java Stream,我理解存在下限通配符的一个原因是,在添加新元素时,集合不是不可变的 例如 List首先,您不应该混淆通配符类型参数和可变性。在列表的元素类型中使用通配符不会阻止修改,它只会对列表的操作施加一些实际限制 将列表声明为list这似乎是两个不同的问题。关于第一个假设,当编译器阻止添加到列表中时,并不意味着列表是不变的。编译器只是遵守语言的静态类型检查规则。另外,列表没有longValue()方法。Hi AR.3感谢您的反馈。我改变了问题,因为你是对的,我检查的是列表方法而不是内容。这确实是两个不同的问

我理解存在下限通配符的一个原因是,在添加新元素时,集合不是不可变的

例如


List首先,您不应该混淆通配符类型参数和可变性。在
列表
的元素类型中使用通配符不会阻止修改,它只会对列表的操作施加一些实际限制


将列表声明为
list这似乎是两个不同的问题。关于第一个假设,当编译器阻止添加到列表中时,并不意味着列表是不变的。编译器只是遵守语言的静态类型检查规则。另外,
列表
没有
longValue()
方法。Hi AR.3感谢您的反馈。我改变了问题,因为你是对的,我检查的是列表方法而不是内容。这确实是两个不同的问题,我只是想解释一下问题的由来。我明白你所说的不可变,但现在它在逻辑上是不可变的,因为编译器不允许你添加到列表中。您现在对这两个问题都有答案了吗?关于第一个问题,已经在中详细回答了。首先,编译器必须推断lambda表达式的类型
(s1,s2)->…
,并限制它是
comparatorhanks@Holger的子类型。你有一些很好的解释。我特别喜欢第二个问题的答案(顺便说一句,使用方法引用,很好的lambda)。我明白你关于易变性的观点。在回答我的第一个问题时,你是说我只能访问对象方法,这是我所期望的,因为引用类型可能是对象,因为这是你在那个时间点上可用的信息。
List<? extends Number> obj = new ArrayList<>();//Now this list is immutable
obj.add(new Integer(5));//Does not compile
List<? super Number> objTwo = new ArrayList<>();//This list is mutable
objTwo.add(new Integer(5));//Compiles
public void testLowerBounds(List<? super Number> numbers){
        if (!numbers.isEmpty()){
           System.out.println(numbers.get(0).longValue());//Does not compile
        }    
Optional<T> min(Comparator<? super T> comparator)
Stream<String> s = Stream.of("monkey", "ape", "bonobo");    
Optional<String> min = s.min((s1, s2) -> s1.length()—s2.length());