如何在Java8中使用流返回特定类型的数组而不是通用类型的数组

时间:2018-08-17 14:54:48

标签: generics java-8 java-stream

我有以下类定义:

public class Triple<T,U,V> {

    private T t;
    private U u;
    private V v;

    public Triple(T t, U u, V v){
        this.t  = t;
        this.u = u;
        this.v  = v;
    }

    public T t(){
        return t;
    }

    public U u(){
        return u;
    }

    public V v(){
        return v;
    }
}

以及

public class Tuple <T,U>{

    private T t;
    private U u;

    public Tuple(T t, U u){
        this.t = t;
        this.u = u;
    }

    public T t(){
        return t;
    }

    public U u(){
        return u;
    }
}

最后

public class State {
    private String name;

    public State(String name){
        this.name = name;
    }
}

我想创建一个方法,该方法将可变数量的三元组作为参数并返回类型为Tuple<Tuple<State,String>,State>[]的值-这是一个元组数组,其中每个元组都有一个State的Tuple作为其第一个成员。字符串,并作为其第二个成员是国家。我已编写但不起作用的方法如下:

public static Tuple<Tuple<State,String>,State>[] mkRelationOne(Triple<String,String,String>...tr){
    return Arrays.stream(tr).map(
            x->new Tuple<Tuple<State,String>,State>(
                new Tuple<State,String>(
                    new State(x.t()), x.u()
                ),
                new State(x.v())
            )
        ).toArray(Tuple<Tuple<State,String>,State>[]::new);
}

错误消息为Cannot create a generic array of type Tuple<Tuple<State,String>,State>。如果它具有类型,类型为Tuple<Tuple<State,String>,State>,它如何通用?以及如何解决此问题,使其返回要返回的数组?谢谢!

1 个答案:

答案 0 :(得分:3)

您正在尝试在那里创建一个generic array ,这在Java中是不受支持的。不能使用类型参数声明数组。

那是您不能创建一个通用数组,但是您可以声明一个:

public static Tuple<Tuple<State, String>, State>[] mkRelationOne(Triple<String, String, String>... tr) {
    return (Tuple<Tuple<State, String>, State>[]) Arrays.stream(tr).map(
            x -> new Tuple<>(
                    new Tuple<>(
                            new State(x.t()), x.u()),
                    new State(x.v())))
            .toArray(Tuple[]::new);
}

这将起作用,但会生成警告。