Java 使用隐式lambda时出现不兼容类型错误
我使用的是java 8,我使用JUnit和AssertJ编写了以下测试代码: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<?
@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);