如何调用一个通用的参数化方法,以JAVA为界?

时间:2019-06-25 13:51:12

标签: java generics

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

例如,我有以下方法:

  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模块中

我找不到解决方法。

有人可以有个主意吗?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

此:

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

表示该方法可以返回可以转换为 any 类的东西,这些类都可以扩展Reader并实现Runnable。但是,只有一个这样的值可以从中安全返回:

return null;

其他任何情况都可能导致ClassCastException。特别是,return new Test();仅在您碰巧希望在上下文中收到Test的情况下成功调用。

通常,如果T在形式参数中不存在,则无法从方法安全地返回非空T。有关更多详细信息,请参见Error Prone's TypeParameterUnusedInFormals check的文档。

如果要从Test返回getInstance()的实例,请删除泛型,并将返回类型设为Test

private static Test getInstance() {
    return new Test(); 
}