如何正确使用generics持有人

我正在尝试为我的应用程序中使用的不同对象创建一个Holder类,我最终得到的代码工作正常,直到某种程度上,构建器模式适用于可选字段,但我想这个持有者可以重构为接受任意数量的参数

package pojos; public class Holder { private final T t; private final R r; private final S s; private final U u; private Holder(final Builder builder) { this.t = builder.t; this.r = builder.r; this.s = builder.s; this.u = builder.u; } public T getField1() { return this.t; } public R getField2() { return this.r; } public S getField3() { return this.s; } public U getField4() { return this.u; } public static class Builder { private T t; private R r; private S s; private U u; public Builder field1(final T t) { this.t = t; return this; } public Builder field2(final R r) { this.r = r; return this; } public Builder field3(final S s) { this.s = s; return this; } public Builder field4(final U u) { this.u = u; return this; } public Holder build() { return new Holder(this); } public Builder copy(final Holder rowMappingsHolder) { this.t = rowMappingsHolder.getField1(); this.r = rowMappingsHolder.getField2(); this.s = rowMappingsHolder.getField3(); this.u = rowMappingsHolder.getField4(); return this; } } 

}

用法示例:

 protected Holder<Row, Map, Void, Void> getRowMapHolder(Row row, Map map) { return (Holder<Row, Map, Void, Void>) new Holder.Builder<Row, Map,Void, Void>().field1(row).field2(map).build(); } 

有任何想法吗?

问候

〜马尔科

这应该如何适用于不同数量的参数? 您具有有限数量的访问器,因此如果不声明,则不能使用h.getField2147()

为不同数量的对象建立元组的另一种方法是异构数组。 在Java,ofc中,您可以只使用Object[]然后可以使用包含方法的类来包装它

 public  T getField(int i) { return (T) arr[i]; } 

然后使用像h.getField(2147)

但是为不同大小的元组创建不同的类(比如4个对象)更好。

感谢Andy的评论和Google Autovalue,一个很好的解决方案出现了:

所以我们可以创建具有意义的不同类,不再是“field1”,“field2”……

 package pojos; import com.google.auto.value.AutoValue; import org.apache.poi.ss.usermodel.Row; import java.util.Map; @AutoValue public abstract class RowMapHolder { public abstract Row row(); public abstract Map mapping(); public static RowMapHolder create(Row row, Map mapping) { return new AutoValue_RowMapHolder(row, mapping); } } 

要么

 package pojos; import com.google.auto.value.AutoValue; import java.util.List; import java.util.Map; @AutoValue public abstract class KeyValuesMapHolder { public abstract List> keyValues(); public abstract Map mapping(); public static KeyValuesMapHolder create(List> keyValues, Map mapping) { return new AutoValue_KeyValuesMapHolder(keyValues, mapping); } }