Я не могу понять, почему у меня есть ошибка компиляции для этого кода:
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
}
ошибка от javac 1.8.0_161:
Ошибка: (84, 36) java: несовместимые типы: не существует экземпляра(ов) переменной(ов) типа
T
, так чтоjava.util.function.Consumer<? super T>
соответствуетjava.util.function.Consumer<java.lang.Void>
Кто-нибудь может объяснить эту ошибку? Спасибо.
EDIT Я попытался упростить свой пример, но сделал ошибку, сделав его слишком простым. Меня интересует объяснение этой ошибки, которая выводится 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
}
IntelliJ считает это ошибкой, потому что «переменная вывода T имеет несовместимые границы: ограничения равенства: нижние границы T: целое число». Но при компиляции все нормально, ошибок нет. Действительно ли это действительный код Java и просто ошибка в IntelliJ? Спасибо.