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);
}
}