以函数varargs为参数的类型安全

时间:2017-11-13 09:18:15

标签: java

我需要编写一个像这样的函数的类

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(函数优先,函数...休息)

修改。 那么我后来出现的是我能做到的。但它仍然没有检查。

谢谢。

2 个答案:

答案 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数组中的类型安全,这只是不可能完成的任务。你丢失了那里的类型信息,你可以做的最好的事情就是使用在运行时发生的反射来检查类型,因此不会在编译时检查类型安全性。

所以我建议只是坚持使用andThencompose方法,除非你有足够的函数,并且实用程序为你带来足够的语法糖,值得这样做。