我想知道如何调用有界参数化方法。
例如,我有以下方法:
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();
}