Java 8 [не может определить переменные типа] проблема - PullRequest
0 голосов
/ 16 октября 2018

У меня есть ThrowingFunction<T, R, E extends Exception> функциональный интерфейс с единственным абстрактным методом, имеющим эту подпись: R apply(T t) throws E.

У меня есть статический служебный метод внутри функционального интерфейса, который позволяет пользователям преобразовывать ThrowingFunction<T, R, E extends Exception> экземпляры в Function<T, R> экземпляров:

static <T, R> Function<T, R> unchecked (final ThrowingFunction<T, R, ?> tf)
{
    // code here
}

Проблема в том, что параметры типа T и R не выводятся компилятором, если я передаю ссылку на метод URL::new в uncheckedметод статической утилиты?

final URL url = unchecked(URL::new).apply("http://www.examples.com");

Я имею в виду, не является ли URL::new действительным условным обозначением для ThrowingFunction<String, URL, MalformedURLException>, и поэтому T и R должны выводиться как String и URL соответственно

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Я не знаю, в чем проблема, но ответ yes, это верный кандидат, и он работает, если вы разделите его на два утверждения:

ThrowingFunction<String, URL, MalformedURLException> ctor = URL::new;
final URL url = unchecked(ctor).apply("http://www.examples.com");
0 голосов
/ 16 октября 2018

Вы правы, это должно работать, скорее всего, это связано с тем, что вы используете ссылку на метод, и компилятор как-то запутался, есть два решения:

// a lambda
ThrowingFunction.unchecked((String x) -> new URL(x));


// an explicit cast
ThrowingFunction.unchecked((ThrowingFunction<String, URL, MalformedURLException>)URL::new);
...