1

私は2つの異なるクラスを持っています。1 つは汎用の valueHolder で、number を拡張するものなら何でも含めることができます。

class ValueHolder<T extends number>{
    private T currentValue;

   //more functions, database logic, etc...
}

他のクラスはより複雑で、「targetValue」があります。また、次のようにパラメータ化されています。

class MoreComplexClass<T extends ValueHolder<?>>
    private T valueHolder;
    private XXX requiredValue;

    //a lot more functions.
}

MoreComplexClass の requiredValue に valueHolder の Type を使用することは「可能」ですか? 私が達成しようとしているのは、 currentValue と requiredValue を > == < 演算子とキャストせずに、また Typesafety を失うことなく比較できることです。(たぶん、これを達成するために複雑にする方法も考えています)

4

2 に答える 2

3

答えはイエスです。複雑なクラスを次のように宣言できます。

class MoreComplexClass<N extends Number, T extends ValueHolder<N>>
    private T valueHolder;
    private N requiredValue;

    //a lot more functions.
}

ただし、Numberクラスを使用しているため、これらの演算子を使用することはできません。これらの演算子を使用できるようにするには、クラスのXXXvalue()メソッド (つまりdoubleValue()、 、longValue())のいずれかを使用する必要がありますNumber

于 2013-01-14T11:08:47.983 に答える
0

コメントにより、いくつかの変更を加えましたが、現在は次のようになっています。

public class ValueHolder<T extends Comparable<T>> {
private T currentValue;

public T getCurrentValue() {
    return currentValue;
}

public void setCurrentValue(T currentValue) {
    this.currentValue = currentValue;
}
}

public class MoreComplexClass<N extends Comparable<N>, T extends ValueHolder<N>> {
private T valueHolder;
private N requiredValue;

public N getRequiredValue() {
    return requiredValue;
}

public void setRequiredValue(N requiredValue) {
    this.requiredValue = requiredValue;
}

public T getValueHolder() {
    return valueHolder;
}

public void setValueHolder(T valueHolder) {
    this.valueHolder = valueHolder;
}
}

これで、ジェネリックな方法でも比較を行うことができます (可能なすべての型にキャストしたくないので、これは本質的です。サイドノートでは、これは日付などでも機能するようになりました。):

public class Main {
public static void main(String[] args) {

    ValueHolder<Long> longHolder = new ValueHolder<>();
    longHolder.setCurrentValue(2L);

    MoreComplexClass<Long, ValueHolder<Long>> mcc = new MoreComplexClass<>();
    mcc.setRequiredValue(1L);

    int compare = mcc.getRequiredValue().compareTo(mcc.getValueHolder().getCurrentValue());

    if (compare < 0) {

    } else if (compare > 0) {

    }else{

    }
}
}

私を正しい方向に向けるための解決策の目盛りを残します;)

于 2013-01-14T11:50:59.833 に答える