gpt4 book ai didi

Java 使用泛型进行模糊方法调用

转载 作者:太空宇宙 更新时间:2023-11-04 10:48:04 27 4
gpt4 key购买 nike

以下示例中的 Java 泛型不明确方法调用:

public class Foo {

public <Y, X extends Y> void set(Path<Y> attribute, X value) {
...
}

public <Y> void set(Path<Y> attribute, Expression<? extends Y> value) {
...
}
}

尝试调用第二种方法

    Foo foo = new Foo();
Path<Object> path = new Path<Object>();
foo.set(path, new Expression<Object>(value));

在 Eclipse 中,没有错误。但在命令行上,编译错误:

error: reference to set is ambiguous
foo.set(path, new Expression<Object>(value));
^
both method <Y#1,X>set(Path<Y#1>,X) in Foo and method <Y#2>set(Path<Y#2>,Expression<? extends Y#2>) in Foo match
where Y#1,X,T,Y#2 are type-variables:
Y#1 extends Object declared in method <Y#1,X>set(Path<Y#1>,X)
X extends Y#1 declared in method <Y#1,X>set(Path<Y#1>,X)
T extends Object declared in class Foo
Y#2 extends Object declared in method <Y#2>set(Path<Y#2>,Expression<? extends Y#2>)

如何调用第二个方法?

最佳答案

没有办法强制编译器选择该方法的任一版本。正如评论中所述,明智的做法是考虑简单地以不同的方式调用这两种方法。

也许您应该考虑定义一个方法,而不是遵循更复杂的 Expression方法,并在必要时定义仅返回给定常量值的表达式。

我认为你应该考虑使用 lambda 或 Supplier<X>支持这些表达式:

public <X> void set(Path<X>, Supplier<? extends X> expression) {
// ...
X value = expression.get();
// ...
}

然后:

final Path1<Integer> daysInAWeek = ...;
final Path2<Date> today = ...;
foo.set(daysInAWeek, () -> 7); // the constant value returning expression.
foo.set(today, () -> Date.todaysDate()); // calculated when invoked.

其中每一个 foo.set代码行隐式声明了一个扩展 Supplier 的内部类。您还可以创建实现Supplier的命名顶级类。并传递一个实例作为 set 中的第二个参数。

如果您坚持拥有自己的 Expression只要符合功能接口(interface)的资格即可找到的接口(interface)/类,例如 Supplier .

关于Java 使用泛型进行模糊方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48179981/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com