创建一个通用的arraylist

时间:2012-05-05 22:08:31

标签: java generics

这是一个2部分问题。

我有两个类:AnimalVehicle我将实例化为对象。 Animal包含两个实例变量:numLegsanimalNameVehicle包含一个实例变量:numTires,两个类都包含getter和setter。

我有一个通用类Box,它包含AnimalVehicle

假设我想要创建Arraylist个框。所述Box中的每个Arraylist都将仅包含Animal类型或仅包含Vehicle类型。

例如:对于纯粹的动物,这看起来会产生以下影响:

List<Box<Animal>> list = new ArrayList<Box<Animal>>(); 
list.add( new Box<Animal>( new Animal( "fluffy", 4 ) ) ); 

(1)。盒子类应该是什么样的?

另外,假设我想从列表中对动物进行吸气。 例如:System.out.println(list.get(0).getName());

(2)。我该如何正确地解决这个问题?

2 个答案:

答案 0 :(得分:1)

我不确定你要追求的是什么,但是如果你想要一个通用类型的Box类,它可能需要看起来像这样:

public class Box<T extends SuperclassOfAnimalAndVehicle> {
  T myModeOfTransport;

  Box(T myModeOfTransport) {
    this.myModeOfTransport = myModeOfTransport;
  }

  public T getModeOfTransport() {
    return myModeOfTransport;
  }
}

这一行:list.get(0).getName()不会这样做。您必须获取Box包含的对象。因此,使用我的示例,它将是list.get(0).getModeOfTransport().getName(),假设VehicleAnimal都有getName()方法。

所有这一切,我真的很困惑为什么这是必要的。也许如果你解释了更大的图片,我可以给你一个更完整的答案。

答案 1 :(得分:0)

如果您想要一个包含两个或多个没有任何共同点的实体的列表,那么您将始终需要专门化代码来解决每个实体。这个Box类完全没用。

Object o = list.get(0);
if(o instanceof Animal) {
   System.out.println(((Animal)o).getName());
}