如何调用有界 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: class ent.Main$Test 不能强制转换为类 java.lang.Runnable (ent.主$测试位于加载器"应用程序"的未命名模块中;java.lang.Runnable 位于加载程序 'bootstrap' 的模块 java.base 中)

而且我找不到解决方案。

有人能有想法吗?

提前谢谢你!

这个:

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

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

return null;

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

通常,如果T形式参数中没有非 nullT,则无法安全地从方法返回非 null 。有关更多详细信息,请参阅错误倾向TypeParameterUnusedInFormals检查的文档。

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

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

最新更新