2

抽象Parameterクラスを作成したいと思います。

public abstract class Parameter{

}

少なくとも 2 つのサブクラスがあります。

public class ParamDouble extends Parameter{
    public final double MIN;
    public final double MAX;
    private double value;

    public ParamDouble(double min, double max, double current){
         this.MIN = min; 
         this.MAX = max; 
         this.value = current; 
         }



    public void setValue(double v) {
        this.value = v;
        }
    public double getValue(){
        return this.value;
        }

}

と:

public class ParamInt extends Parameter{
    public final int MIN;
    public final int MAX;
    private int value;

    public ParamDouble(int min, int max, int current){
         this.MIN = min; 
         this.MAX = max; 
         this.value = current; 
         }



    public void setValue(int v) {
        this.value = v;
        }
    public int getValue(){
        return this.value;
        }

}

したがって、すべてのサブクラスは、finals MIN と MAX、および value を必要とし、3 つの引数コンストラクターと setValue() および getValue() を含みますが、それらの型は異なります。

これらの変数を抽象クラスで宣言するにはどうすればよいですか?

4

3 に答える 3

4

正しい型がバインドされたジェネリック クラスが 1 つだけ必要です。

public class Parameter<T extends Number & Comparable<T>> {
    public final T min;
    public final T max;
    private T value;

    public Parameter(T min, T max, T current) {
        this.min = min; 
        this.max = max; 
        setValue(current); // Use setter to check range on construction 
    }

    public void setValue(T v) {
        // being Comparable, we can check the range generically
        if (max.compareTo(v) < 0) { 
            throw new IllegalArgumentException("Value exceeds " + max);
        }
        if (min.compareTo(v) > 0) {
            throw new IllegalArgumentException("Value is below " + min);
        }

        this.value = v;
    }

    public T getValue() {
        return this.value;
    }
}


の説明<T extends Number & Comparable<T>>

の境界はTです。つまり、 aa のNumber & Comparable<T>両方でなければなりません。これは、メソッドを持つ を実装していないために行われますが、すべてのクラス (例: ) が実装しており、メソッドのパラメーター範囲をチェックするメソッドが必要です。Number Comparable<T>NumberComparablecompareTo()java.lang.NumberIntegercompareTo()setValue()

この特別な境界がなければ、範囲を一般的にチェックすることはできません。


もう 1 つの大きな変更点は、変数ではなく、変数を作成minしてインスタンス化することでした。静的な最小/最大値をコンストラクターに渡すか、次のようなサブクラスを実装することを検討してください。maxstatic

public class IntegerParameter extends Parameter<Integer> {

     public IntegerParameter(Integer current) {
         // specify a default min/max for the Integer impl
         super(-1, 999, current); 
     }
}
于 2012-11-06T00:32:34.797 に答える
1

言及したいことがいくつかあります

1) Javaジェネリックを調べる必要があります。これはその有力候補でしょう。

 public class Parameter<T extends Number> {
   private T value;

   public Parameter(T value) { this.value = value }

   public T getValue() { return value };
 }

次に、Double または Integer のパラメーターを宣言できます。

 Parameter<Double> doubleParam = new Parameter<Double>(2.5);
 Parameter<Integer> intParam = new Parameter<Integer>(1);

2) コンストラクターで MIN と MAX を設定したくないと思います。これにより、その場で変更できます。たとえば、次のように設定を許可する前に MIN と MAX をチェックした場合を考えてみましょう。

 public void setValue(T value)
 {
    if (value < MIN || value > MAX) // error
    else
      this.value = value;
 }

今、私は何か奇抜なことをすることができました

 Parameter<Integer> i1 = new Parameter<Integer>(0, 10, 4);
 i1.set(11); // this would error, until we did

 Parameter<Integer> i2 = new Parameter<Integer>(0, 15, 4);
 i1.set(11); // now it works

それがあなたの望みならそれでいいのですが、少し奇妙に思えます。min および max を通常の (非静的) メンバーにするか、他の方法で初期化するだけでよい場合があります。

于 2012-11-06T00:29:54.453 に答える
1

java.lang.Numberは、java.lang.Integer および java.lang.Doubleのスーパー クラスです。値のタイプを数値にするだけです。

    private Number value;

    public abstract void setValue(Number v);
    public abstract Number getValue();

ただし、 static final 変数MINおよびMAXが抽象クラスで宣言されている場合、static finalとマークされているため、サブクラスでそれらを継承することはできません。

于 2012-11-06T00:23:21.113 に答える