【问题标题】:how to call a generic parameterized method bounded JAVA?如何调用有界JAVA的泛型参数化方法?
【发布时间】:2019-06-25 13:51:12
【问题描述】:

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

例如,我有以下方法:

  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 中)

我找不到解决办法。

有人能出主意吗?

提前谢谢你!

【问题讨论】:

  • 为我工作(Java 10)。您确定您正确粘贴了代码吗?如果你打电话给foo(new Test())怎么办?
  • 您的代码无法编译。你有一些错别字。你能把所有的课程都放进去吗,即使它们只是骷髅?并显示哪些类包含其他方法和类。但是当我自己猜测并修改它时,它似乎起作用了。
  • 我猜你的意思是T extends Reader &amp; Runnable,而不是T extends extends &amp; Runnable
  • @Zefick 你是对的。是我错了。事实上,我使用了错误的类。我发现它不起作用很奇怪。非常感谢。

标签: java generics


【解决方案1】:

这个:

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

表示该方法可以返回可以转换为 any 类的东西,该类既扩展了Reader,又实现了Runnable。但是,只有一个这样的值可以让您安全地返回:

return null;

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

一般来说,如果T 不在形式参数中,您就不能安全地从方法返回非空T。详情请参阅Error Prone's TypeParameterUnusedInFormals check 的文档。

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

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

【讨论】:

  • 每当一个可怜的 Generic 在海中溺水时,Andy 都会来救援!
猜你喜欢
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多