【问题标题】:Abstract baseclass' generic data type return抽象基类的通用数据类型返回
【发布时间】:2016-09-21 16:03:13
【问题描述】:

我正在做一个项目,其中一个要求是我们使用通用数据类型。(其他要求:抽象类、继承、保存/加载函数、聚合和组合)

我想我会创建一个库来满足所有要求,很难想出何时/何地使用通用数据类型的好主意,然后很明显,如果我有一个类称为 Media 和两个子类称为 BookCD 书的长度是 int(pages),CD 的长度是 double(minutes & seconds )

我认为在 Media 中制作这个会有所帮助:

    public abstract class Media<T>{
        private T length;
        //lots of other variables & methods here, took out for sake of cutting to the chase

        public T getLength(){
            return length;
        }

        public void setLength(T length){
            this.length = length;
        }
    }

问题:

但是现在的问题是,当它在 getLength 中没有收到一个类型时,它如何返回一个类型,因此除非以某种方式设置,否则它不知道它是哪种类型?或者一个解决方案是让每个子类在构造函数中调用一次这个函数来设置它?

我可以在子类 BookCD 中以某种方式覆盖 private T length; 变量吗?只是为了设置它们的类型,以便 getLength 以它应该的方式运行,还是有其他解决方案?

可以选择在其他地方使用通用数据类型,但我只是不知道在哪里合适,我的教授甚至在超出要求时都在吹毛求疵,所以他们让我知道,如果他们让我失望了认为某些东西“使用不当”或“不是一个好例子”,即使“礼仪”不是必需的。

【问题讨论】:

  • 为什么不使用Media作为接口?
  • 它没有收到getLength() 中的类型,但它在您创建Media&lt;Something&gt; 实例时收到了一个。您能否展示一个您打算在其中使用此Media 类的代码示例?
  • @MuratK。抽象类是一个要求
  • 好吧,这些类将被指定为class Book extends Media&lt;Integer&gt;class CD extends Media&lt;Double&gt;。此外,它不会返回intdouble,它会返回IntegerDouble
  • 为了使Media 有用,它需要可用作伞形类。如果您打算稍后在BookCD 的混合列表中使用getLength() 做很多事情,您应该将Media 声明为public class Media&lt;T extends Number&gt;

标签: java generics return abstract


【解决方案1】:

感谢安迪·特纳的解决方案,以及其他人的贡献,但他给出了有帮助的答案,那就是:

我做了什么:

class Book extends Media{
...
}
class CD extends Media{
...
}

我应该补充的:

class Book extends Media<Integer>{
...
}
class CD extends Media<Double>{
...
}

【讨论】:

    【解决方案2】:

    这是协变类型的好例子,Java 1.5 或更高版本支持这种行为。泛型是可选的,因为返回类型是协变的,但可以根据需要添加,并且应该同样工作。

    public class CovariantTest {
    
      public static void main(String[] args) {
        Media book = new Book();
        assert book.getLength().getClass() == Integer.class;
        Media cd = new Cd();
        assert cd.getLength().getClass() == Double.class;
    
        //Just for sake of being complete
        assert book.getLength().getClass() == Number.class; // AssertionError
        assert cd.getLength().getClass() == Number.class; // AssertionError
    
      }
    }
    
    abstract class Media {
      private Number length;
    
      public Number getLength() {
        return length;
      }
    
    }
    
    class Book extends Media {
    
      @Override
      public Integer getLength() {
        return 5;
      }
    }
    
    class Cd extends Media {
      @Override
      public Double getLength() {
        return 5.01;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      相关资源
      最近更新 更多