【发布时间】:2016-03-20 11:35:28
【问题描述】:
我使用的是 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);
}
在第一次断言时出现编译错误: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>>
我有以下问题:
- 第一个断言中 lambda 的返回类型真的是
<? extends Class<? extends Number>。
我只是依赖IDEA生成的局部变量。 - 如果是,那为什么? getClass 文档说
The actual result type is Class<? extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called.
如果我理解正确,应该是Class<? extends Number>。 - 我应该使用哪个工具来查看隐式 lambda 的类型?我可以使用 JDK 中的一些工具检查它吗?
- 为什么最后一个带有方法引用的断言编译?如果它真的返回
Class<?>,那么我明白了,但是为什么这个和隐式lambda的返回类型不同?
相关 AssertJ 文档:
AbstractIterableAssert
AbstractIterableAssert.html#extracting
AbstractIterableAssert.html#containsExactlyElementsOf
【问题讨论】:
标签: java generics lambda java-8 type-inference