Flo*_*n M 2 java generics bounded-wildcard
我无法理解为什么我的代码有编译错误:
private static <T> Consumer<T> f3()
{
return t -> {};
}
private static <T> Consumer<? super T> f4()
{
return t -> {};
}
@Test
public void test()
{
Consumer<Integer> action3 = f3();
Consumer<Integer> action4 = f4(); // ERROR
}
Run Code Online (Sandbox Code Playgroud)
来自javac 1.8.0_161的错误:
错误:(84,36)java:不兼容类型:不
T存在类型变量的实例,因此java.util.function.Consumer<? super T>符合java.util.function.Consumer<java.lang.Void>
谁能解释这个错误?谢谢.
编辑 我试图简化我的例子,我做错了太简单了.我感兴趣的是IntelliJ输出的这个错误的解释:
private static <T> BiConsumer<T, ? super Throwable> f1(Consumer<? super Throwable> consumer)
{
return null;
}
private static <T> BiConsumer<? super T, ? super Throwable> f2(Consumer<? super Throwable> consumer)
{
return null;
}
@Test
public void test()
{
BiConsumer<? super Integer, ? super Throwable> action1 = f1(throwable -> { });
BiConsumer<? super Integer, ? super Throwable> action2 = f2(throwable -> { }); // ERROR HERE
}
Run Code Online (Sandbox Code Playgroud)
IntelliJ认为这是一个错误,因为"推理变量T具有不兼容的边界:等式约束:T下界:整数".但是在编译时,它很好,没有错误.这是一个真正有效的Java代码,只是IntelliJ中的一个错误?谢谢.
A Consumer<? super Something>不是Consumer<Integer>.
编译器不知道Consumer类上没有生成器方法,因此它会阻止您将其用作生成器.
就类型推断规则而言,例如,Consumer和之间没有区别List.因此,阻止您编写以下内容的相同规则也会阻止您执行以下操作:
List<? super Integer> c = Arrays.asList("");
List<Integer> d = c; // Compiler error; let's pretend it works.
Integer i = d.get(0); // ClassCastException!
Run Code Online (Sandbox Code Playgroud)