9

以下のような単純なクラスがありますが、ジェネリックを使用して値を返すことについて質問があります。

import java.util.ArrayList;
public class Box<T extends Number> {
    private ArrayList<T> list;
    public Box(){
        list = new ArrayList<T>();
    }
    public T get(int i){
        if(i <list.size())
            return list.get(i);
        else
            return 0; // Problem
    }
}

i < list.size() がnullでない場合、0 (または 0.0 - T の値に依存) を取得する必要があります。これを行うには、これを適切にコーディングするにはどうすればよいですか?

4

4 に答える 4

9

デフォルトで本当に0 を返したい場合は、次のようにすることができます。

public abstract class Box<T extends Number> {
    private List<T> list;

     public Box(){
        list = new ArrayList<T>();
    }

    public T get(int i){
        if(i <list.size())
            return list.get(i);
        else
            return getDefault();
    }

    protected abstract T getDefault();
}

次に、サポートする Number サブタイプごとに実装を行います。

public class IntegerBox extends Box<Integer> {

    @Override
    protected Integer getDefault() {
        return 0;
    }
}

public class DoubleBox extends Box<Double> {

    @Override
    protected Double getDefault() {
        return 0D;
    }
}

これの優れた機能は、ゼロだけでなく、任意のデフォルトを返すことができることです...同じ原則が、数値だけでなく、任意のタイプのオブジェクトに対しても機能します。

于 2013-05-24T20:02:30.863 に答える
9

Boxget が一致を見つけられないときにゼロまたはデフォルト値を返すことが本当に必要な場合は、タイプ T のゼロまたはデフォルトのコンストラクター パラメーターを使用できます。

次に、メソッドでそのデフォルト値を返しますget

例:

public class Box<T extends Number> {
    private ArrayList<T> list;
    private T defaultValue;
    public Box( T defaultValue){
        list = new ArrayList<T>();
        this.defaultValue = defaultValue;
    }
    public T get(int i){
        if(i <list.size())
            return list.get(i);
        else
            return defaultValue;
    }
}
于 2013-05-24T20:07:30.960 に答える
2

すべてのタイプのサブクラスを作成し、パラメータ化してタイプを明示的にチェックしない限り、これを行うことはできません。これは正常です。タイプを作成できます

public StrictlyPositiveInteger implements Number

値が 0 でさえない場合は、

Box<StrictlyPositiveInteger> box = new Box<>();

つまり、特定の型に対して特定の動作が必要なため、一般的な方法では実行できません。

于 2013-05-24T23:34:46.163 に答える
2

0でありint、ジェネリックはオブジェクト参照でのみ機能します (プリミティブ型ではありません)。コードを修正する方法は、null代わりに返されます。

public T get(int i){
    if(i <list.size()) {
        return list.get(i);
    }
    return null; // Problem solved
}

i < list.size() でない場合、0 (または 0.0 - T によって異なります) を取得する必要があります。null

show 0 to userなどのプレゼンテーション テーマは、これらのメソッドではなく、データを表示するクラス/メソッドによって処理される必要があることを考慮してください。これは、オブジェクト参照を返さなければならないときに 0 を返す方法がないことを意味します。

于 2013-05-24T19:57:59.790 に答える