繁体   English   中英

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

[英]how to call a generic parameterized method bounded 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());
    }

但是我有以下例外:

线程“主”中的异常java.lang.ClassCastException:类ent.Main $ Test无法转换为类java.lang.Runnable(ent.Main $ Test在加载程序“ app”的未命名模块中; java.lang.Runnable是在加载程序'bootstrap'的模块java.base中)

而且我找不到解决方案。

有人可以有个主意吗?

先感谢您 !

这个:

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

意味着该方法可以返回可以转换为任何类的类, 这些类既扩展Reader并实现Runnable 但是,只有一个这样的值可以从中安全返回:

return null;

任何其他情况都可能导致ClassCastException 特别是, return new Test(); 仅当您恰好在期望接收Test的上下文中被调用时,才会成功。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM