Java - 列表,类型和继承(也许是通用的?)

时间:2014-08-23 19:23:09

标签: java list generics inheritance types

假设我有类颜色的类。我想创建一些子课程,红色绿色蓝色。然后,在一个完全独立的类中,我有一个类型为 Color 的名为 Rainbow 的List。我希望能够将所有类型的颜色(红色,贪婪,蓝色)放入列表彩虹,以后我可以搜索列表 Rainbow 通过一种颜色来查看它是否包含其中一种颜色。这是我想要完成的一些伪代码:

class Color(){}
class Red extends Color(){}
class Blue extends Color(){}
class Green extends Color(){}
class JustSomeClass(){
    List<Color> Rainbow;
    Rainbow.add(new Red());
    Rainbow.add(new Blue());
    Rainbow.add(new Green());

    public Color getTypeOfColor(typeOfColor){
        for(Color c : Rainbow){
            if(c.getType().equals(typeOfColor)){
                return c;
            }
        }
    }
}

我不熟悉Java,知道实现这一目标的好方法。有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:1)

你应该考虑一些事情。集合(例如List)使用hashCode()方法和equals()方法来完成工作。您必须为类Color覆盖这些方法,以便Collection知道该怎么做。

之后,你应该考虑Color真正做了什么。每种颜色都是独特的?你的彩虹可以有多种颜色吗?如果不是(每种颜色红色与所有颜色相同)使用Set。如果有多种口味(超过一种具体的红色),那么你的清单可能会更好。

这里是Set one。运行时,会打印false,然后打印true

public class RainbowTest {
   public static void main(String[] args) {
      Set<Color> rainbow = new HashSet<>();
      rainbow.add(new Red(.1f));
      rainbow.add(new Blue(.1f));
      rainbow.add(new Green(.1f));
      System.out.println(rainbow.contains(new Blue(.5f)));
      System.out.println(rainbow.contains(new Red(.1f)));
   }
}

abstract class Color {
   private final float intensity;

   public Color(float intensity) {
      this.intensity = intensity;
   }

   public float getIntensity() {
      return intensity;
   }

   @Override
   public int hashCode() {
      int hash = 3;
      hash = 83 * hash + Float.floatToIntBits(this.intensity);
      return hash;
   }

   @Override
   public boolean equals(Object obj) {
      if (obj == null)
         return false;
      if (getClass() != obj.getClass())
         return false;
      final Color other = (Color) obj;
      if( this.intensity != other.intensity )
         return false;
      return true;
   }

}

class Red extends Color {

   public Red( float intensity ) {
      super( intensity );
   }

}
class Green extends Color {

   public Green( float intensity ) {
      super( intensity );
   }

}
class Blue extends Color {

   public Blue( float intensity ) {
      super( intensity );
   }

}

答案 1 :(得分:0)

通用&lt; color&gt;不会允许它的子类 将其用作&lt; T extends color&gt;

答案 2 :(得分:0)

你可以有一个类RainBow,它将扩展List的具体实现。
这是因为RainBow实际上 IS 是一个颜色列表。

public class RainBow extends ArrayList<Color> {

public void addColor(Color color)
{
    this.add(color);
}

public Color getTypeOfColor(String typeOfColor){
    for(Color c : this){
        if(c.getClass().getSimpleName().equals(typeOfColor)){
            return c;
        }
    }
    return null;
}
}

然后您可以像这样使用此类:

    Red red = new Red();
    Blue blue = new Blue();
    Rainbow rainbow = new Rainbow();
    rainbow.add(red);
    rainbow.add(blue);
    if (rainbow.getTypeOfColor("Yellow") == null) {
        //Color doesn't exist
    }
    if (rainbow.getTypeOfColor("Red") != null) {
        //Color exists
    }

请注意,这会使用类名进行比较。