【问题标题】:Java - List, types, and Inheritance (maybe generic?)Java - 列表、类型和继承(可能是通用的?)
【发布时间】:2014-10-17 09:41:57
【问题描述】:

假设我有一个 Color 类型的类。我想创建一些子类,RedGreenBlue。然后,在一个完全独立的类中,我有一个名为 Rainbow 的列表,类型为 Color。我希望能够将所有类型的颜色(Red、Greed、Blue)放入列表Rainbow,这样以后我可以搜索列表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 还不够熟悉,不知道有什么好方法来完成这个任务。有人可以指出我正确的方向吗?

【问题讨论】:

  • 您编写的代码几乎可以正常工作。您似乎关心哪一部分?
  • Color 是做什么的?您可以使用enumswitch 吗?或者,否则,访问者模式会更好。
  • 在构造函数或方法中移动Rainbow.add(new Red());调用。
  • 如果没有更多细节,我们很难告诉您这是否是一个好方法。你打算怎么用这个?为什么需要检查颜色?你不能用哈希来检查颜色吗?
  • downvoter 让我知道Map&lt;String,Color&gt; 有什么问题?

标签: java list generics inheritance types


【解决方案1】:

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

在那之后,你应该想想Color 的真正作用。每种颜色都是独一无二的吗?您的彩虹中可以有不止一种颜色吗?如果不是(每种颜色红色与所有颜色相同),请使用 Set。如果有不止一种口味(不止一种具体的红色),那么您的清单可能会更好。

这是第一个。运行时,它会打印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 );
   }

}

【讨论】:

【解决方案2】:

一个通用的 不允许它是子类 将其用作

【讨论】:

  • 抱歉,是的,通用列表可以包含其子类的成员。请参阅我的工作代码答案。
【解决方案3】:

你可以有一个 RainBow 类来扩展 List 的具体实现。
这是因为彩虹实际上颜色列表。

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
    }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多