我需要编写一个像这样的函数的类
class Converter <T>{
public <R> R convertBy(Function<T,?>... args){
Function<T,?> function = args[0];
// doing something
return function.apply(t);
}
}
我需要这个方法是类型安全的,首先来自args的函数需要与这个类类型具有相同的参数类型。例如,如果我的转换器是Converter<String>
,我需要检查(在编译时)第一个函数是否具有String参数。
另外,当我写这样的方法时,它说它返回对象,而我无法做到
int a = converter.convertBy(func1,func2);
因为说Object不能转换为int。
- 编辑
也许更大的图片将更容易得到它的内容。因此convertBy函数的含义是它可以轻松地在不同类型上组合不同的操作。
当我定义像
这样的函数时,这是有效的public <R> R convertBy(Function... args)
但是它不是类型安全的。我需要的是确保我的转换器是&#39;转换器&#39;用户不能像第一个参数函数那样传递 函数func =(string) - &gt; {return(String)string.length();}
我也无法改变
的参数convertBy(Function... args)
要 convertBy(函数优先,函数...休息)
修改。 那么我后来出现的是我能做到的。但它仍然没有检查。
谢谢。
答案 0 :(得分:1)
在编译时确保您的Function
具有返回类型R
的方法是将其声明为Function<T,R>
。
如果您还想接受具有不同类型的未指定数量的其他函数,您可以编写如下函数:
public <R> R convertBy(Function<T,R> first, Function<?,?>... others)
这样返回类型匹配第一个函数的返回类型。 但是,如果不知道你试图用其他功能做什么,很难知道它们应该具备什么类型。
答案 1 :(得分:1)
你可以很容易地在没有varargs的情况下实现它,你需要做的就是制作几个具有不同功能的方法。这种方法通常用于优化,因为varargs几乎不像普通方法那样优化。
<R> R convertBy(Function<T, R> fnc);
<R,U> R convertBy(Function<T, U> fnc1, Function<U, R> fnc2);
// etc.
您无法确保Function
数组中的类型安全,这只是不可能完成的任务。你丢失了那里的类型信息,你可以做的最好的事情就是使用在运行时发生的反射来检查类型,因此不会在编译时检查类型安全性。
所以我建议只是坚持使用andThen
或compose
方法,除非你有足够的函数,并且实用程序为你带来足够的语法糖,值得这样做。