Как вызвать универсальный параметризованный метод ограниченный JAVA? - PullRequest
0 голосов
/ 25 июня 2019

Я хотел бы знать, как я могу вызвать ограниченный параметризованный метод.

Например, у меня есть следующий метод:

  public static<R extends Reader & Runnable> R foo(R r) {
         r.run();
         return r;
  }

Я хотел бы знать, как это вызватьmethod.

Я пытаюсь следующий код:

    private static class Test extends Reader implements Runnable {
        ...........
    }

    private static <T extends extends & Runnable> T getInstance() {
        return (T) new Test(); 
    }

    public static void main(String[] args) {
        foo(getInstance());
    }

Но у меня есть следующее исключение:

Исключение в потоке "main" java.lang.ClassCastException: class ent.Main $ Test не может быть приведен к классу java.lang.Runnable (ent.Main $ Test находится в безымянном модуле загрузчика 'app'; java.lang.Runnable находится в модуле java.base загрузчика 'bootstrap')

И я не могу найти решение.

Может у кого-нибудь есть идея?

Заранее спасибо!

1 Ответ

1 голос
/ 25 июня 2019

Это:

private static <T extends Reader & Runnable> T getInstance() {

означает, что метод может возвращать что-то, что может быть приведено к любому классу, который одновременно расширяет Reader и реализует Runnable. Однако есть только одно такое значение, которое вы можете безопасно вернуть из этого:

return null;

Все остальное может привести к ClassCastException. В частности, return new Test(); будет успешным, только если вы случайно вызвали контекст, ожидающий получения Test.

Как правило, вы не можете безопасно вернуть ненулевое T из метода, если T не входит в формальные параметры. См. Документацию Проверка на ошибки TypeParameterUnusedInFormals Проверка для получения более подробной информации.

Если вы хотите вернуть экземпляр Test из getInstance(), отбросьте шаблоны и сделайте тип возврата Test.

private static Test getInstance() {
    return new Test(); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...