java是java8方法引用,需要显式声明类型
我已经写了一个方法
// CheckedFunction<T, R> is a functionality interface has a method apply which throws a checked exception
public static <T, R> R nullToDefault(T object, R defaultObject, CheckedFunction<T, R> function) {
return isNull(object) ? defaultObject : nullToDefault(sneakyInvoke(object, function), defaultObject);
}
在许多模块中使用,所有的用法在运行时只有一个地方正确(在jar文件中)
public static String getSessionAddr(IoSession session) {
if (session != null) {
return LINE_WRAPPER + "sessionId=" + session.getId() +
";local=" + nullToDefault(session.getLocalAddress(), "null", Object::toString) +
";remote=" + nullToDefault(session.getRemoteAddress(), "null", Object::toString) +
";service=" + nullToDefault(session.getServiceAddress(), "null", Object::toString) + LINE_WRAPPER;
}
return "";
}
在这个方法中,Object::toString
被标识为Function<T,R>
,所以我得到了一个NoSuchMethodError
如果我将Object::toString
标识为CheckedFunction<Object, String>
显式,问题就会消失
这种情况让我感到困惑
我在什么地方写错了吗
有人能告诉我这是怎么回事吗。谢谢
以下是我写的所有相关方法:
public static <T, R> R nullToDefault(T object, R defaultObject, CheckedFunction<T, R> function) {
return isNull(object) ? defaultObject : nullToDefault(sneakyInvoke(object, function), defaultObject);
}
public static <T, R> R nullToDefault(T object, CheckedFunction<T, R> function) {
return nullWithConvert(object, function);
}
public static <T, R> R nullWithConvert(T object, CheckedFunction<T, R> function) {
return isNull(object) ? null : sneakyInvoke(object, function);
}
public static <R> R nullToDefault(R object, CheckedSupplier<R> function) {
return isNull(object) ? sneakyInvoke(function) : object;
}
public static <T, R> R nullToDefaultSupplier(T object, Supplier<R> supplier, Function<T, R> function) {
return isNull(object) ? nullToDefault(supplier, Supplier::get) : function.apply(object);
}
共 (0) 个答案