我正在尝试为一大堆类定义一个容器,因为代码的某些部分对于集合更有意义,但其他地方对于单个值更有意义。
理想情况下我想这样做:
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 类型系统无法实现您想要的目的。 由于您无法拥有通用容器类型,因此您需要使用专用构造函数(或子类)来强制执行不变量。
但是,如果您这样做,类的客户端将无法区分不同的容器类型(Optional
与 List
),它们将需要使用通用抽象(例如 Stream
、Iterator
、Iterable
,无论适合您什么)。
这是一个例子:
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/