我很难理解以下有关两个Predicate对象的代码。第一个使用下界通配符,第二个使用上界通配符。
Predicate<? super String> p1 = s -> s.startsWith("a"); // why can I call startsWith()?
Predicate<? extends String> p2 = s -> s.startsWith("a");
p1.test("a"); // works
p2.test("a"); // doesn't work (why?)
Run Code Online (Sandbox Code Playgroud)
我不明白的p1是,为什么可以从类中调用方法String,例如startsWith()?为什么我只能将String对象传递到p1.test(),我希望也可以调用Number和Object对象。
就像p1我想的p2那样,但事实并非如此。我什String至无法将对象传递到中p2.test()。这对我来说没有任何意义,因为我们希望有一个继承自String(包括String)的对象。
我认为这可能与以下事实有关:我们指定引用类型而不是对象本身的类型。但是该对象使用什么类型?