【发布时间】:2017-08-14 09:51:59
【问题描述】:
我想概括以下模式:
setChangeListener = c -> {
try {
// do something dangerous
} catch (final IOException e) {
logger.error(e.getLocalizedMessage(), e);
}
};
我想这样使用它:
errorLoggingSetChangeListener = c -> {
// do something dangerous
};
我在想这个:
public class ErrorLoggingSetChangeListener<T> implements SetChangeListener<T> {
private static final Logger logger = Logger.getLogger(ErrorLoggingSetChangeListener.class);
private final SetChangeListener<T> delegate;
@Override
public void onChanged(final SetChangeListener.Change<? extends T> change) {
try {
delegate.onChanged(change);
} catch (final Exception e) {
if (logger.isEnabledFor(Level.ERROR)) {
logger.error(e.getLocalizedMessage(), e);
}
}
}
public ErrorLoggingSetChangeListener(final SetChangeListener<T> delegate) {
super();
this.delegate = delegate;
}
}
但这是不可能的,因为 ErrorLoggingSetChangeListener 不是函数式接口。
有没有机会将此类转换为功能接口?
这不会编译:
public interface ErrorLoggingSetChangeListener<T> extends SetChangeListener<T> {
static final Logger logger = Logger.getLogger(ErrorLoggingSetChangeListener.class);
@Override
default void onChanged(final SetChangeListener.Change<? extends T> change) {
try {
SetChangeListener.super.onChanged(change);
} catch (final Exception e) {
if (logger.isEnabledFor(Level.ERROR)) {
logger.error(e.getLocalizedMessage(), e);
}
}
}
}
这也不编译:
errorLoggingSetChangeListener = new ErrorLoggingSetChangeListener<>(c -> {
throw new IOException();
});
错误信息是
未处理的异常 [..]
.
【问题讨论】:
-
这没有意义,您尝试调用未实现的函数。 super 的功能没有实现,因为你覆盖了它。你只为接口提供了1个功能,但尝试使用它2次...
-
@JohnnyAW 同意了。如何解决这个问题?
-
你无法以你想要的方式使用它(至少在java中,也许其他语言可以做到)。 Waitö 让我想想……
-
使用您的
ErrorLoggingSetChangeListener,您可以按如下方式使用它:errorLoggingSetChangeListener = new ErrorLoggingSetChangeListener(c -> {// do something dangerous});。我认为这是您可以使用它的唯一方法... -
也不编译,请参阅更新后的问题。