Java 使用<;无效>;类型?

Java 使用<;无效>;类型?,java,Java,假设我有这个界面: public interface IAsyncCallback<T, E> { void done(E e, T v); } 我希望您可以将IAsyncCallback转换为IEachCallback或反之亦然,也许您可以?似乎您应该能够强制转换一个方法,该方法接受另一个方法的参数超集。真的没有一种本机方法可以简化此操作 一种解决方法是在IEachCallback界面中使用默认方法实现IEachCallback,并允许用户传递单参数lambda:

假设我有这个界面:

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

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

真的没有一种本机方法可以简化此操作

一种解决方法是在
IEachCallback
界面中使用默认方法实现
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);
}
这就允许用户以更简单的方式调用它:

IAsyncCallback<Void,Object> cb = IEachCallback.ofVoid( e -> {});
IAsyncCallback 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);
    }
}
公共接口IAsyncCallback{
无效完成(E、E、T、v);
消费者的静态IAsyncCallback(消费者回调){
return(t,e)->callback.accept(t);
}
}

我尝试了
可选
以及
无效
,同样,需要两个参数所有类型都至少是一个
对象
,所以我认为最好的方法就是传递一个静态的预制
对象
。。。与null基本相同的是,首先使用另一个接口并使用默认方法的技术是killer,谢谢,尽管我不确定如果使用
cb::done
,会发生什么,谁知道呢。@AlexanderMills您可以使用该方法引用,只要它与接口兼容。兼容的方法引用与lambdasYeah几乎可以互换,我的意思是我不知道它将绑定到哪个
done
方法,默认的done方法还是抽象的done方法。只能将方法引用链接到一个抽象方法
done
。因此,取决于由它实现的接口,两个抽象方法中的任何一个都将匹配(这里只有一个抽象方法的接口签名)
//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 -> {};
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);
    }
}