У меня есть класс Foo с параметром универсального типа
static class Foo<T> {
T get() {return null;}
void set(T t) {}
}
Я хочу определить экземпляр java.util.function.Consumer, который работает для ЛЮБОГО Foo независимо от его аргумента универсального типа.Потребитель просто вызовет метод set для экземпляра Foo и передаст значение, возвращаемое методом get.Я решил использовать Lambda для реализации потребителя:
Consumer<Foo> compilesButWithWarnings = foo -> foo.set(foo.get());
К сожалению, я получаю предупреждения с этой реализацией.Предупреждение:
The method set(Object) belongs to the raw type Foo.
References to generic type Foo<T> should be parameterized.
Если я попытаюсь записать свою лямбду как:
Consumer<Foo<?>> compileError = foo -> foo.set(foo.get());
, код больше не будет компилироваться, выдав мне ошибку:
The method set(capture#1-of ?) in the type Foo<capture#1-of ?> is not
applicable for the arguments (capture#2-of ?)
Единственное решение, которое я мог бы придумать, которое компилирует без предупреждений, это:
Consumer<Foo<?>> worksButRequiresStaticMethod = Test::setFoo;
static <ANY> void setFoo(Foo<ANY> foo) {
foo.set(foo.get());
}
, что пока нормально, но немного многословно.Если это вообще возможно, я хотел бы знать, есть ли лучший способ написать этот код без предупреждений и без изменения Foo.
Большое спасибо.