3 回答
TA贡献1824条经验 获得超5个赞
另一种解决方法是使用为您提供使用者实例的通用方法。
例如:
static class Foo<T> {
T get() {return null;}
void set(T t) {}
}
public static <T>Consumer<Foo<T>> getFooConsumer() {
return foo -> foo.set(foo.get());
}
public static void main(String[] args) {
Consumer<Foo<String>> cons = getFooConsumer();
Foo<String> foo = new Foo<>();
foo.set("foo!");
cons.accept(foo);
}
请注意,由于您的使用者代码实现目前并没有多大用处,因此根据您的实际需求,很难判断此解决方法是否有任何帮助。
您总是可以进一步推动它,并将您选择的值注入到您的已消费中Foo,例如:
public static <T>Consumer<Foo<T>> getFooConsumer(T t) {
return foo -> foo.set(t);
}
TA贡献1807条经验 获得超9个赞
无法定义适用于任何泛型类型的实例。泛型类型对于该特定实例必须是已知的,并且是编译器静态类型签名的一部分。
这将起作用:
Consumer<Foo<Object>> c = (Foo<Object> o) -> o.set(o.get());
那是该特定通用参数值 (Object) 的一个实例。
对于每个单独的类型,您都需要另一个“实例”。
说得通?
这就像要求一个任何类型的变量。
一个变量只有一种类型。在编译时已知。
TA贡献1909条经验 获得超7个赞
如果可以编辑Foo,则可以添加一个方法来在内部处理此问题:
void update() {
set(get());
}
然后只需使用该方法作为消费者:
Consumer<Foo<?>> consumer = Foo::update;
否则,我认为静态方法是唯一的方法。您需要避免<?>在set调用点使用 通配符类型,因为您可以传递给无界通配符方法参数的唯一内容是null.
添加回答
举报