我想知道如何调用有界参数化方法。
例如,我有以下方法:
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模块中
我找不到解决方法。
有人可以有个主意吗?
提前谢谢!
答案 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();
}