gpt4 book ai didi

java - 使用 类型使参数可选?

转载 作者:行者123 更新时间:2023-11-30 07:42:17 24 4
gpt4 key购买 nike

假设我有这个界面:

  public interface IAsyncCallback<T, E> {
void done(E e, T v);
}

在某种情况下,我希望有人能够使用:

IAsyncCallback<Void,Object> cb = e -> {};

很明显他们不应该期待第二个参数(第二个参数 v 总是 null。

这有可能吗?在协调 2 个参数和 1 个参数方法以便它们可以互换时遇到了一些麻烦。

基本上想找到一种使用泛型来使用可选参数的方法,但我很好奇是否有另一种方法可以做到这一点,因为上述技术不起作用,它需要 2 个参数,你可以' t 忽略参数等。

顺便说一句,如果我有这样的界面:

  public interface IEachCallback<T, E> {
void done(E e);
}

我希望您可以将 IAsyncCallback 强制转换为 IEachCallback 或相反,也许您可​​以?似乎您应该能够转换一个方法,该方法采用另一个方法的参数的超集。

最佳答案

确实没有一种本地方法可以让这变得简单。

一种解决方法是使用 IEachCallback 接口(interface)中的默认方法实现 IEachCallback 并允许用户传递单参数 lambda:

public interface IEachCallback<T, E> extends IAsyncCallback<T, E> {

@Override
default void done(E e, T t) {
this.done(t);
}

void done(T e);
}

这允许调用者传递一个单参数 lambda,但它仍然会带来赋值问题:

//there's no way to assign or pass as argument directly
//Otherwise users have to do this type cast:
IAsyncCallback<Void,Object> cb = (IEachCallback<Void, Object>) e -> {};

为了解决这个问题,我将向 IEachCallback 添加一个静态工厂方法:

public interface IEachCallback<E> extends IAsyncCallback<Void, E> {

@Override
default void done(E e, Void t) {
this.done(e);
}

void done(E e);

static <E> IAsyncCallback<Void, E> ofVoid(IEachCallback<E> callback) {
return (e, v) -> callback.done(e);
}
}

这允许用户以更简单的方式调用它:

IAsyncCallback<Void,Object> cb = IEachCallback.ofVoid( e -> {});

为了进一步改进,您可能希望将其移至父界面,并完全消除子界面:

public interface IAsyncCallback<T, E> {
void done(E e, T v);

static <E> IAsyncCallback<Void, E> ofConsumer(Consumer<E> callback) {
return (t, e) -> callback.accept(t);
}
}

关于java - 使用 <Void> 类型使参数可选?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54955359/

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