Java元组没有创建多个类型参数

时间:2015-03-12 01:04:06

标签: java tuples

有没有办法在Java中创建Tuple,而无需创建多个类?

例如,可以为每个不同类型的元组创建一个不同的类,每个元组具有不同的Type Parameters个数:

public class SingleTuple<T>{}
public class DoubleTuple<T1, T2>{}
public class TripleTuple<T1, T2, T3>{}
public class QuadraTuple<T1, T2, T3, T4>{}
public class PentaTuple<T1, T2, T3, T4, T5>{}

通过这样做,也可以创建一个没有Type Parameters的Tuple对象:

public class Tuple{

    private Object[] objects;

    public Tuple(Object... objects){
        this.objects = objects;
    }

    public Object get(int index){
        return this.objects[index];
    }
}

除非使用了这个,否则一旦将它们从元组中取出,所有对象都必须被转换为正确的子类,使其像ArrayList<Object>一样,但功能较少。

有没有办法只创建一个单一的类,并且有多个Type Parameters而没有定义所有这些(就像在第一个例子中一样),使用这样的东西?

public class Tuple<T...>{

}

3 个答案:

答案 0 :(得分:5)

不。如果您想要类型安全,则必须像在第一个代码段中一样创建它们。例如,有些库可以为您执行此操作,jOOL

答案 1 :(得分:3)

是一个可怕的解决方法。

您只需要一个班级Pair<A, B>。然后,您可以拥有QuadraTuple<T1, T2, T3, T4>而不是Pair<T1, Pair<T2, Pair<T3, T4>>>

要从中获取T3,您必须编写T3 t3 = quadraTuple.second().second().first();。它是类型安全的,可以扩展到任意数量的参数。

永远不要这样做。

答案 2 :(得分:-2)

我设计了一个 Java 库,它实现了一个类型不安全的元组(Tuple 类),其灵感来自 Python 语言的元组。 与其他答案一样,如果您想在 Java 中实现类型安全,则应该为元组的每个元素定义一个泛型类型。或者,您可以在运行时检查预期类型,并捕获一种 Java 异常。我的库还公开了一个类型化元组(BoundTuple 类),它允许在运行时执行更严格的类型检查,以便在必要时最大限度地减少编程错误。要执行严格的类型检查,开发人员必须创建架构(TupleSchema 类),并且必须在对绑定的元组实例调用 get() 方法时指定预期类型。

我邀请您在 GitHub 上查看我的存储库:JTuple

这个元组实现对我非常有用,我在许多其他项目中不断采用它。