有没有办法在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...>{
}
答案 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
这个元组实现对我非常有用,我在许多其他项目中不断采用它。