首页 > 解决方案 > 如何在java中增加泛型类型值

问题描述

我的任务是将给定类转换为抽象和泛型类,生成泛型类型的值序列,并支持接受初始值的单个构造函数。

这是给定的类:

public class Progression {

protected long current;

public Progression(){

    this.current=0;
}

public Progression(long start){
    this.current=start;
}
public long nextValue(){
    long answer= current;
    advance();
    return answer;
}
protected void advance(){
    current++;
}

public void printProgression(int n){
    System.out.println(nextValue());
    for(int j=0;j<n;j++){
        System.out.println(" "+nextValue());
    }
    System.out.println();
}
}

我做了这样的变换:

abstract class ReProgression<T> {
protected T current;
public ReProgression(T start){
    current=start;
}
public T nextValue(){
    T answer= current;
    advance();
    return answer;
}
public void advance(){


}
public void printProgression(int n){
    System.out.println(nextValue());
    for(int j=0;j<n;j++){
        System.out.println(" "+nextValue());
    }
    System.out.println();
}

}

如何提前()函数增加通用值“当前”?

标签: javagenericsdata-structures

解决方案


可能的解决方案 1

进展是一个需要定义的术语。在您最初的示例中Progression,您正在推进 a long,因此很容易确定如何推进。只是增加数字。当您将它从 long 转换为泛型类型时,您不再知道该类型是什么(因此是泛型),因此您必须以某种方式定义如何前进。泛型类型 T必须在它“前进”时定义 bavious。在 Java 中执行此操作的标准方法是使用接口

我会创造这样的东西 -

public interface Advancable{
   public void advance();
}

在你的ReProgression课堂上,你会像这样使用这个界面 -

abstract class ReProgression<T extends Advancable> {
   protected T current;
   public ReProgression(T start){
      current=start;
   }
   public T nextValue(){
      T answer= current;
      advance();
      return answer;
   }
   public void advance(){
      current.advance();
   }
   public void printProgression(int n){
      System.out.println(nextValue());
      for(int j=0;j<n;j++){
         System.out.println(" "+nextValue());
      }
      System.out.println();
   }
}

这就是解决方案。但是,我应该讨论如何调用代码。在最初的示例Progression中,您可以这样称呼它,例如 -

Progression p  = new Progression(1);
p.printProgression(5);

哪个会产生输出

 1
 2
 3
 4
 5

要对 做同样的事情ReProgression,您可能会像这样调用它 -

MyAdvancable<Long> startValue = new MyAdvancable<Long>(5);
ReProgression rp = new ReProgression(startValue);
rp.printProgression(5);

但是您还需要定义 MyAdvancable

可能的解决方案 2

你自己几乎有正确的答案。您的问题是“将给定的类转换为抽象和通用类”。声明一个抽象类只有在至少有一个抽象方法时才有意义。通常这是因为在编写代码时行为是未知的或未定义的。这听起来很像您在问题中评论的未知“推进”机制。所以你所拥有的几乎就是你的解决方案。只需删除 Advance() 方法的主体 -

abstract class ReProgression<T> {

   protected T current;

   public ReProgression(T start){
      current=start;
   }

   public T nextValue(){
      T answer= current;
      advance();
      return answer;
   }

   abstract void advance();

   public void printProgression(int n){
      System.out.println(nextValue());
      for(int j=0;j<n;j++){
         System.out.println(" "+nextValue());
      }
      System.out.println();
   }

}

我有两个解决方案的原因是因为从您的问题来看,并且没有更多关于您本书当前章节中涵盖哪些主题的背景,对我而言,这两个都是可能的,如果您需要决定其中哪一个,如果任何,可能是你的解决方案。祝您学习 Java 的旅途顺利!


推荐阅读