我想知道如何调用有界参数化方法。例如,我有以下方法: 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 回答
慕姐4208626
TA贡献1852条经验 获得超7个赞
这:
private static <T extends Reader & Runnable> T getInstance() {
意味着该方法可以返回可以转换为任何既扩展Reader
又实现的类的东西Runnable
。但是,只有一个这样的值可以安全地返回:
return null;
其他任何事情都可能导致ClassCastException
. 特别是,return new Test();
只有当您碰巧在期望收到Test
.
通常,如果形式参数中没有特征,则无法T
从方法中安全地返回非空值。有关详细信息,请参阅Error Prone 的检查T
文档。TypeParameterUnusedInFormals
如果要返回Test
from的实例getInstance()
,请删除泛型并设置返回类型Test
。
private static Test getInstance() { return new Test(); }
添加回答
举报
0/150
提交
取消