我有一个带有泛型类型参数的类 Foo
static class Foo<T> {
T get() {return null;}
void set(T t) {}
}
我想定义一个 java.util.function.Consumer 的实例,不管它的泛型类型参数如何,它都适用于任何 Foo。消费者将简单地调用 Foo 实例上的 set 方法并传入 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.
如果我尝试将我的 lambda 写为:
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。
沧海一幻觉
函数式编程
jeck猫
相关分类