传递不同的容器类型

时间:2018-06-03 06:33:21

标签: java generics

我正在尝试为一大堆类定义一个容器,因为代码的某些部分对于不同的容器会更有意义。例如,我可能在某些地方使用Set,在其他地方使用List。

我试着这样做:

public class AllModes<T> {

   private T<Car> car;
   private T<Boat> boat;
   private T<Train> train;
   private T<Plane> plane;
   ...
}

但是我得到的错误是“T型不是通用的;它不能用参数&lt; Car&gt;参数化”

我在多个变量中定义它们而不是基于超类的单个HashSet的原因是我希望得到返回正确类型的方法,以避免此类的使用者需要在每个对象都具有其拥有不同的领域。

1 个答案:

答案 0 :(得分:2)

参数Collection在您的示例中是uselss。只需使用一个class AllModes { private List<Car> cars; private List<Boat> boats; private List<Train> trains; private List<Plane> plain; } 来存储所有必需的对象。

AllModes

如果您想要选择特定的集合类型 - 当您在Supplier中只有一个集合时,这很容易且安全。但是你有4种不同的类型。我认为你可以使用class AllModes { private final Collection<Car> cars; private final Collection<Boat> boats; private final Collection<Train> trains; private final Collection<Plane> plain; public AllModes(Supplier<Collection<?>> supplier) { cars = (Collection<Car>)supplier.get(); boats = (Collection<Boat>)supplier.get(); trains = (Collection<Train>)supplier.get(); plain = (Collection<Plane>)supplier.get(); } } 提供的方法:

AllModes modesWithSet = new AllModes(HashSet::new);
AllModes modesWithList = new AllModes(ArrayList::new);

客户端代码如下:

import uiBootsrapDatetimepicker from 'angularjs-bootstrap-datetimepicker';
angula.module('myModule', [uiBootsrapDatetimepicker])