Ссылка метода java8 должна объявить тип явно - PullRequest
1 голос
/ 03 июля 2019

Я должен написать метод

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