匹配捕获的类型检查是否与上限绑定?

bil*_*.cn 9 java typechecking java-8

创建一个类似的

public class Play {
    public static void main(String[] args) throws Exception {
        outer(Integer.class, inner("abc"));
    }

    static <C> void outer(Class<C> c, List<? super C> s){
    }

    static <C> List<C> inner(C c) {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

它在Java 8中编译!(在Eclipse 4.5和JDK1.8_25中都有)https://ideone.com/Q9JLHP

在Eclipse中,所有的边界都被正确地推断出来,但是如何通过参数来outer捕获?Supplier<? super Integer>Supplier<String>

编辑:澄清这是Java 8特定的,并使示例不那么混乱.

Lou*_*man 10

inner("abc")可以根据编译器的判断,将其解释为Supplier任何超类型的String. - 例如,

Supplier<Object> inner = inner("abc");
Run Code Online (Sandbox Code Playgroud)

工作得很好,因为"abc"同样Object.这就是这里发生的事情:inner让你回归Supplier<Object>.

  • 除了帮助lambda表达式之外,它还解决了自Generics引入以来存在的缺陷,即你不能写`List <Number> l = Arrays.asList(42);`或`List <T> l = condition?...:Collections.emptyList();`等等.如果它破坏了现有的代码,那么现有的代码是有缺陷的,因为当手动插入推断类型时,相同的代码将通过旧的编译器,即这里通过说`outer (Integer.class,Play.<Object> inner("abc"));` (2认同)