【问题标题】:How to enforce a List containing mixed types?如何强制执行包含混合类型的列表?
【发布时间】:2020-06-03 17:51:52
【问题描述】:

我有一个 Java 类,它表示要发送给第三方的数据数组:

import java.util.List;

abstract class DataToSend<T> {
    private T value;
    public T getValue() { return value; }
}
public class ListToSend extends DataToSend<List> {
   // ...
}

我无法更改DataToSend,并且ListToSend 必须扩展DataToSend

第三方允许此列表包含整数、浮点数、布尔值或字符串,并允许混合这些类型。我该如何执行?

例如,我可以使用原始的 ListList&lt;Object&gt;,但这样就可以让例如将地图放在列表中 - 我不想要这个。

我也可以像这样定义一个“ListElement”类:

class ListElement {
    private int a;
    private float b;
    private boolean c;
    private String d;
}

然后说ListToSend extends DataToSend&lt;List&lt;ListElement&gt;

有更好的选择吗?

【问题讨论】:

  • ListToSend 不应重新定义 valuegetValue()
  • @Kayaman 啊,是的,谢谢。
  • 根据您的需要,您可以让您的ListElement 持有Object,并为特定类型提供构造函数。有 4 个变量,其中 3 个始终未使用,处理起来会很复杂。

标签: java list generics java-8


【解决方案1】:

可能有很多解决方案,但我们对您所拥有的灵活性知之甚少。

当然,您不能在建议的ListElement 中使用原语 - 如果默认情况下所有设置都将具有默认值(int:0,boolean:false,String:null),您怎么知道设置了哪一个?

例如 - 您如何创建和管理基础列表? 1. 也许您可以创建专门的方法来将元素添加到此列表中?例如

ListToSend request = new ListToSend();
request.addInt(1);
request.addLong(2L);
request.addString("3");
request.addInts(List.of(4, 5, 6)); // public void addInts(List<Integer> list) {...}
// and so on
  1. 您可以使用 builder 来做类似的事情并强制执行类型

-

MixedList list = MixedList.builder()
    .addInts(List.of(1, 2, 3))
    .addLong(1L)
    ... // and so on
new ListToSend(list);

在哪里ListToSend extends DataToSend&lt;MixedList&gt;

  1. 在列表中为每个数据类型创建一些包装对象,并可能使用Optional

-

interface MixedType<T> {
    Class<?> getType();
    T getValue();
}
class IntType implements MixedType<Integer> {...}
class FloatType implements MixedType<Float> {...}
class StringType implements MixedType<String> {...}

class ListToSend extends DataToSend<List<MixedType>>

但这需要您编写自己的序列化程序,然后任何人都可以添加新类型,这取决于您的用例。

我希望这会有所帮助。

【讨论】:

  • 我没有想到你提出的关于原语默认值的问题 - 谢谢。
猜你喜欢
  • 2020-02-17
  • 1970-01-01
  • 2019-02-15
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 2023-01-25
  • 1970-01-01
相关资源
最近更新 更多