我想让以下代码更安全,但不要将类型参数放在正确的位置。
我有一个abstract class Function implements FunctionInterface
具有一些功能并显示通过FunctionInterface
实现的内容。还有另一个通用ReturnSomethingInterface<T>
。现在有许多函数extends Function
和方法
public Object openDialog(FunctionInterface myFunction)
{
"display and do something with myFunction"
Object returnValue = null;
if (myFunction instanceof ReturnSomethingInterface<?>)
{
returnValue = myFunction.returnSomething();
}
return returnValue;
}
所以显然有些函数会返回一些东西而其他函数会赢得(return null
)并且返回类型会有所不同。
到目前为止的解决方案:
- 只需致电openDialog(myFunctionWithoutReturnValue)
并忽略返回的null
值,或者我有类似MyReturnType result = (MyReturnType) openDialog(myFunctionWithReturnValueOfMyReturnType)
的内容。
此处我会收到警告,因为未经检查的转化为Object
到MyReturnType
。
我的解决方案:使用类型参数将返回的类型绑定到ReturnSomethingInterface<T>
中的泛型类型。
当我执行public <T, S extends FunctionInterface & ReturnSomethingInterface<T>> T openDialog(S myFunction)
之类的操作时,我现在可以编写MyReturnType result = openDialog(myFunctionWithReturnValueOfMyReturnType)
而无需转换返回的值,也不会发出有关未经检查的转换的警告。
我的问题:不执行ReturnSomethingInterface
的功能不再是openDialog()
的有效参数。
我需要或希望拥有的另一种方法openDialog(.. myFunction)
接受实施FunctionInterface
的参数,但不实施ReturnSomethingInterface
。
我的问题:有类似的东西吗?或者有没有这样的原因?
解决方法是将openDialog()
重命名为openDialogWithoutReturn()
,以查看包含不会返回任何内容的参数的调用,但我更喜欢带有类型参数的解决方案。有什么想法吗?