?????μ?JEP Candidate ????????Java?и??????????????????μ?JEP Candidate???????Java 10????????????????????????????????????????????????????????????????????????????????????·????????????????????????????????????
????????????????????????????????????????????Java???????????????????????????????к??????????????????????????????????JEP????????????????????????????????????????????Java??????????????????????????·????????????
????????Э??????
???????μ?????????????????????ó???
????public class Product {
????/* ... */
????}
????public class FrozenProduct extends Product {
????/* ... */
????}
????????и?????scan(Product product)???????????????FrozenProduct???????ù????????????????????????????????????????????а??????????????????????????????μ???????????
????private void addAllProducts(List<Product> products) {
????/* Check product stock */
????shoppingCart.addAll(products);
????}
????private void freezerSection() {
????List<FrozenProduct> frozenProducts = /* select frozen products */;
????addAllProducts(frozenProducts); // ERROR: List<Product> expected
????//        List<FrozenProduct> found
????}
????????Java????÷??????????й???????????????????????????????????衣???仰???????÷????????????????????????????????????????????
?????????????????????У???????????addAllProducts???????????List of Product??????????????????????????????????????????????κ??????????????????????Э??????Java?п?????extends?????
????private void addAllProducts(List<? extends Product> products) {
????/* Check product stock */
????shoppingCart.addAll(products);
????}
????private void freezerSection() {
????List<FrozenProduct> frozenProducts =  /* select frozen products */;
????addAllProducts(frozenProducts); // works with no problem
????}
????????Щ?????У?????????????????????????????Щ?????????У??????????????????????????????????????μ??????
????private boolean askQuestion(Predicate<String> p) {
????return p.test("hello");
????}
????private void applyPredicate() {
????Predicate<Object> evenLength = o -> o.toString().length() % 2 == 0;
????askQuestion(evenLength); // ERROR: Predicate<String> expected
????//        Predicate<Object> found
????}
??????????????£??????????????string “hello”??lambda o -> o.toString().length() % 2 == 0?в?????????????????????????????????????askQuestion???????Predicate of String??????????????????????????μ?????????????????Java?п?????super?????
????private boolean askQuestion(Predicate<? super String> p) {
????return p.test("hello");
????}
????private void applyPredicate() {
????Predicate<Object> evenLength = o -> o.toString().length() % 2 == 0;
????askQuestion(evenLength); // works with no problem
????}
????????????????????????????????????????????????????????????????岻?????????????????????????????????addAllProducts??Э???????????????????????????????????????????????????????????????????????????????????????????????????????????????????μ????????????
????????????????????
?????????????????????????????????????????????? Predicate<String> ???????У???????????????????????? Predicate<? extends String> ??????????????????????????????????У????????????£???????????????????壬???????????? JEP 300 ???????????????????????????????????????????????????????????????????????????????????????????? Predicate<contravariant T> ????д??? Predicate<T> ??????????κ?????????д Predicate<String> ?????????????? Predicate<? super String> ??
????????1????????δ??????????????????Щ?????????μ???????????? Function<contravariant T?? covariant R> ????????????????????????Scala?е???? (Function<-T?? +R>) ??????C#?е??????? (Function<in T?? out R>) ?????????????????????????Щ????????????????????????????????????????????д?????????????????????????????????????
????????????????????JEP 300???????μ????????????????Java???п?????κ?????????????JEP 300????????????????????????????????????汾??JEP????С?