如何调用有界JAVA的泛型参数化方法?

我想知道如何调用有界参数化方法。


例如,我有以下方法:


  public static<R extends Reader & Runnable> R foo(R r) {

         r.run();

         return r;

  }

我想知道如何调用这个方法。


我尝试以下代码:


    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:类 ent.Main$Test 无法转换为类 java.lang.Runnable(ent.Main$Test 在加载程序“app”的未命名模块中;java.lang.Runnable 是在加载程序“bootstrap”的模块 java.base 中)


而且我找不到解决方案。


有人可以有想法吗?


先感谢您 !


慕运维8079593
浏览 65回答 1
1回答

慕姐4208626

这:private&nbsp;static&nbsp;<T&nbsp;extends&nbsp;Reader&nbsp;&&nbsp;Runnable>&nbsp;T&nbsp;getInstance()&nbsp;{意味着该方法可以返回可以转换为任何既扩展Reader又实现的类的东西Runnable。但是,只有一个这样的值可以安全地返回:return&nbsp;null;其他任何事情都可能导致ClassCastException.&nbsp;特别是,return new Test();只有当您碰巧在期望收到Test.通常,如果形式参数中没有特征,则无法T从方法中安全地返回非空值。有关详细信息,请参阅Error Prone 的检查T文档。TypeParameterUnusedInFormals如果要返回Testfrom的实例getInstance(),请删除泛型并设置返回类型Test。private&nbsp;static&nbsp;Test&nbsp;getInstance()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Test();&nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java