1

これが私のコードです:

public class Sequence<T> {

    protected List<T> sequence = new ArrayList<T>();

    public Matrix<OrderedPair<T, ?>> createCartesianProduct(Sequence<?> secondSequence) {
        Matrix<OrderedPair<T, ?>> result = new Matrix<OrderedPair<T, ?>>();
        for (int rowIndex = 0; rowIndex < sequence.size(); rowIndex++) {
            Sequence<OrderedPair<T, ?>> row = new Sequence<OrderedPair<T, ?>>();
            for (int columnIndex = 0; columnIndex < secondSequence.length(); columnIndex++) {
                row.add(new OrderedPair(sequence.get(rowIndex), secondSequence.sequence.get(columnIndex)));
            }
        }
        return result;
    }
}

これは Eclipse でコンパイルされますが、内側の for ループ ( row.add(...) ) 内の行で、次の 3 つの警告が表示されます。

  • OrderedPair生タイプです。ジェネリック型への参照OrderedPair()<T1, T2>はパラメーター化する必要があります。
  • 型の安全性: OrderedPair 型の式は、準拠するために未チェックの変換が必要です。OrderedPair<T, ?>
  • 型の安全性: コンストラクター OrderedPair(Object, Object) は生の型 OrderedPair に属します。ジェネリック型 OrderedPair への参照<T1, T2>はパラメーター化する必要があります

ここで強力な型チェックを強制するためにジェネリックを使用したいと思いますが、ジェネリックについての私の理解は、その方法を理解するには不十分だと思います。誰かが私を教育できますか?

ありがとう、

-- ケン

4

5 に答える 5

9

内側の for ループのコンストラクターにはジェネリックが必要です。

row.add(new OrderedPair <T, ?> (sequence.get(rowIndex), secondSequence.sequence.get(columnIndex)));

しかし、このようには使えません??したがって、すべてのs を文字に置き換える必要がありますE<E>次に、次のように署名に を追加します。

public <E> Matrix<OrderedPair<T, E>> createCartesianProduct(Sequence<E> secondSequence) {

そうしないと、コンパイラは がどこEから来たのかわかりません。

于 2008-12-22T19:44:02.333 に答える
1

OrderedPair は生成されませんが、生成されるリスト (Sequence) に追加されます。この警告を取り除くには、たとえば "new OrderedPair<...>(...)" を実行して、ジェネリックを使用して OrderedPair を構築する必要があります。

ここでは、メソッド全体にジェネリックを追加したので、戻り値の型は secondSequence の型と一致します。

public <Z> Matrix<OrderedPair<T, Z>> createCartesianProduct(Sequence<Z> secondSequence) {
    Matrix<OrderedPair<T, Z>> result = new Matrix<OrderedPair<T, Z>>();
    for (int rowIndex = 0; rowIndex < sequence.size(); rowIndex++) {
        Sequence<OrderedPair<T, Z>> row = new Sequence<OrderedPair<T, Z>>();
        for (int columnIndex = 0; columnIndex < secondSequence.length(); columnIndex++) {
            addToRow(row, sequence.get(rowIndex), secondSequence.sequence.get(columnIndex));
        }
    }
    return result;
}

static <T, Z> void addToRow(Sequence<OrderedPair<T, Z>> seq, T t, Z z) {
    seq.add(new OrderedPair<T, Z>(t, z));
}
于 2008-12-22T20:04:13.960 に答える
1

ここで少し混乱していると思います。タイプSequence<T>では何になりますTか?

a を定義するSequence<OrderedPair<T, ?>>と、T での再帰が発生します。

本当に必要なものが次のようなものかどうかを確認してください。

public class Sequence<T> {

    protected List<T> sequence = new ArrayList<T>();

    public <T2> Matrix<OrderedPair<T, T2>> createCartesianProduct(Sequence<T2> secondSequence) {
        Matrix<OrderedPair<T, T2>> result = new Matrix<OrderedPair<T, T2>>();
        for (int rowIndex = 0; rowIndex < sequence.size(); rowIndex++) {
                Sequence<T> row = new Sequence<T>();
                for (int columnIndex = 0; columnIndex < secondSequence.length(); columnIndex++) {
                        row.add(new OrderedPair<T, T2>(sequence.get(rowIndex), secondSequence.sequence.get(columnIndex)));
                }
        }
        return result;
    }
}
于 2008-12-22T20:28:48.670 に答える
0

コンパイラを信頼し、OrderedPair を呼び出すときは常に汎用パラメーターを使用するようにしてください:)必須ではありませんが、良い習慣だと思います。

次の理由により、Java で厳密なジェネリックを適用することはできません。

タイプ消去

于 2008-12-22T19:29:53.920 に答える
0

次のように、ジェネリック型をコンストラクターに追加するだけです。

row.add(new OrderedPair<T, ?>(sequence.get(rowIndex), secondSequence.sequence.get(columnIndex)));

コンパイラは、明示的な型なしで型を渡しているときにOrderedPair型を受け取ることを期待しているため、エラーをスローしています。コンパイラーが話しているのは、基本的にコンストラクターが必要なときにコンストラクター<T, ?>を提供しているため、進行中のチェックされていない変換であり、間違った型が誤って渡された場合に例外がスローされる可能性があるためです。unchecked conversion<?, ?><T, ?>

于 2008-12-22T19:43:26.483 に答える