1

ジェネリック型に使用できるJavaクラスを定義しようとしていますが、Characterなどの可能なパラメーター型、または手動で定義できるオブジェクト型のコンストラクターを定義したいと思います。

私が作成しようとしているクラスは次のように呼ばれます。

public class Repeated<T> implements Pict {

private T[][] elements;

private double scale;

public Repeated(T[][] elems) {
    elements = elems;
}
}

したがって、文字配列を追加し、Tのみがタイプ文字である場合に特定の処理を実行するコンストラクターを追加したいと思います。出来ますか?または、これをインターフェイスにして、後で実装する必要がありますか?

4

2 に答える 2

2

あなたはこれを行うことができるはずです:

public Repeated(T[][] elems) {
    elements = elems;
    boolean isCharacterArrayArray = false;
    if (elems != null) {
        for (T[] elt : elems) {
            if (elt != null && elt.length > 0) {
                isCharacterArrayArray = elt[0] instanceof Character;
                break;
            }
        }
    }
    if (isCharacterArrayArray) {
        // received a Character[][]
    }
}

ただし、型消去のため、これらの呼び出しを区別できないと思います。

new Repeated((Character[][]) null);
new Repeated((Integer[][]) null);

ある種の明示的なクラス引数を渡さずに。

編集クラス引数を使用すると、すべてがはるかに簡単になります。

public Repeated(T[][] elems, Class<T> cls) {
    elements = elems;
    if (cls.equals(Character.class)) {
        // passed a Character[][]
    }
}
于 2012-11-11T22:48:19.050 に答える
2

したがって、文字配列を追加し、Tのみがタイプ文字である場合に特定の処理を実行するコンストラクターを追加したいと思います。

ポリモーフィズムの良い例のように聞こえます:

public class RepeatedChars extends Repeated<Character> {

    public RepeatedChars(Character[][] chars) {
        super(chars);
        //do special stuff
    }

    //other character-specific logic if applicable
}

このクラスを実装の詳細として非表示にすることもできます。

public class Repeated<T> implements Pict {

    ...

    private static class RepeatedChars extends Repeated<Character> {
        //see above
    }

    public static Repeated<Character> makeForChars(Character[][] chars) {
        return new RepeatedChars(chars);
    }
}
于 2012-11-11T23:01:20.720 に答える