Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用隐式lambda时出现不兼容类型错误_Java_Generics_Lambda_Java 8_Type Inference - Fatal编程技术网

Java 使用隐式lambda时出现不兼容类型错误

Java 使用隐式lambda时出现不兼容类型错误,java,generics,lambda,java-8,type-inference,Java,Generics,Lambda,Java 8,Type Inference,我使用的是java 8,我使用JUnit和AssertJ编写了以下测试代码: @Test public void test() { List<Number> actual = new ArrayList<>(); actual.add(Double.valueOf(1)); actual.add(Integer.valueOf(1)); actual.add(Long.valueOf(1)); List<Class<?

我使用的是java 8,我使用JUnit和AssertJ编写了以下测试代码:

@Test
public void test() {
    List<Number> actual = new ArrayList<>();
    actual.add(Double.valueOf(1));
    actual.add(Integer.valueOf(1));
    actual.add(Long.valueOf(1));

    List<Class<? extends Number>> expected = new ArrayList<>();
    expected.add(Double.class);
    expected.add(Integer.class);
    expected.add(Long.class);

    // Just information how IDEA is generating types for the different statements
    ListAssert<? extends Class<? extends Number>> implicitLambda = assertThat(actual).extracting(t -> t.getClass());
    ListAssert<Class<? extends Number>> explicitLambda = assertThat(actual).extracting((Extractor<Number, Class<? extends Number>>) t -> t.getClass());
    ListAssert<Class<?>> methodReference = assertThat(actual).extracting(Number::getClass);

    // Does not compile
    // Error:(31, 84) java: incompatible types: java.util.List<java.lang.Class<? extends java.lang.Number>> cannot be converted to java.lang.Iterable<? extends java.lang.Class<capture#1 of ? extends java.lang.Number>>
    assertThat(actual).extracting(t -> t.getClass()).containsExactlyElementsOf(expected);

    // Compile because of explicit types
    assertThat(actual).extracting((Extractor<Number, Class<? extends Number>>) t -> t.getClass()).containsExactlyElementsOf(expected);

    // Compile, but don't understand why
    assertThat(actual).extracting(Number::getClass).containsExactlyElementsOf(expected);

}
@测试
公开无效测试(){
列表实际值=新的ArrayList();
实际增加(第(1)项的两倍价值);
实际值加(整数.valueOf(1));
实际增加(第(1)项的长期价值);
List>methodReference=assertThat(实际)。提取(Number::getClass);
//不编译

//错误:(31,84)java:不兼容的类型:java-8类型推断中的java.util.List比以前的java版本更复杂。特别是,现在表达式的类型可能取决于周围的上下文,而不仅仅是表达式本身。当您编写

ListAssert<? extends Class<? extends Number>> implicitLambda = assertThat(actual).extracting(t -> t.getClass());

有时候这是最短的路。

谢谢你的回答。
ListAssert<Class<?>> implicitLambda2 = assertThat(actual).extracting(t -> t.getClass());
// compiles fine
assertThat(actual).<Class<? extends Number>>extracting(t -> t.getClass()).containsExactlyElementsOf(expected);
// also compiles
assertThat(actual).<Class<?>>extracting(t -> t.getClass()).containsExactlyElementsOf(expected);