用于可选单值或集合的 Java 泛型

标签 java generics

我正在尝试为一大堆类定义一个容器,因为代码的某些部分对于集合更有意义,但其他地方对于单个值更有意义。

理想情况下我想这样做:

public class AllModes<T> {
   private T<Car> car;
   private T<Boat> boat;
   private T<Train> train;
   private T<Plane> plane;
   ...40 more of these...
}

然后我想使用这样的类:

AllModes<List> allModes;
AllModes<Optional> oneOfEachMode;

但是我得到的错误是“类型 T 不是通用的;它不能用参数进行参数化”

我在多个变量中定义这些变量而不是基于父类(super class)的单个 HashSet 的原因是我希望 get 方法能够返回正确的类型,以避免此类的使用者需要在任何地方进行强制转换,因为每个对象都有自己不同的字段。

我还考虑过只存储单个值列表或集合,但我认为使用我想要的正确类型(即一个值)可​​能不太容易出错

最佳答案

使用 Java 类型系统无法实现您想要的目的。 由于您无法拥有通用容器类型,因此您需要使用专用构造函数(或子类)来强制执行不变量。

但是,如果您这样做,类的客户端将无法区分不同的容器类型(OptionalList),它们将需要使用通用抽象(例如 StreamIteratorIterable,无论适合您什么)。

这是一个例子:

public class AllModes {
    private final Supplier<Stream<Car>> cars;
    private final Supplier<Stream<Boat>> boats;

    public AllModes(Optional<Car> car, Optional<Boat> boat) {
        // Assuming Java 8, when Optional did not have a stream() method yet
        this.cars = () -> car.map(Stream::of).orElse(Stream.empty());
        this.boats = () -> boat.map(Stream::of).orElse(Stream.empty());
    }

    public AllModes(List<Car> cars, List<Boat> boats) {
        this.cars = cars::stream;
        this.boats = boats::stream;
    }

    public Stream<Car> getCars() {
        return cars.get();
    }

    public Stream<Boat> getBoats() {
        return boats.get();
    }
}

关于用于可选单值或集合的 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51121892/

相关文章:

swift - Swift 中具有新泛型的泛型扩展

java - 使用 Hibernate 和 JPA 持久化 JSON 对象

java - 范围或 ms sql xml 参数是什么?

java - 调整图片大小以适合 JLabel

只有一个类型参数的 Java 嵌套泛型类

Java 类泛型

c# - 为什么 C# 4.0 中的类没有泛型变化?

c# - List<T> 和 ArrayList<T> 哪个更快?

java - 功能测试的代码覆盖率

java - 有没有任何指南展示如何在 Eclipse 中使用 appengine 和 Maven 有效构建应用程序?