0

私が指導している学生は、Dietel の Java に関する本を使用する Web 開発クラスを受講しています。この本には、ジェネリックに関する次の興味深いコードが含まれています。

class StackComposition <T>
{
    private List<T> stackList;

    public StackComposition()
    {
        stackList = new List<T>("stack")  // ERROR
    }

    // .... more code
}

このコードが機能しない理由は明らかであり、インストラクターが学生にこのコードを開始点として使用することを推奨する理由について当惑しています。ジェネリックを理解していないだけで、Java のスキルが不足しているのかもしれませんが、ジェネリック型でジェネリック コレクションをインスタンス化する方法がわかりません。一般的な List コレクションを使用して実行時に型を決定することで Stack を作成することが意図されているようですが、上記の構成を使用してこれがどのように可能になるかはわかりません。私の最初の傾向は、ジェネリックStack<T>オブジェクトを使用し、このカスタム Stack クラスを記述することを忘れるように学生に伝えることでしたが、どうやらそれは課題の目標ではないようです。

これを回避するためにパッケージを使用してテストを試みましたjava.lang.reflectが、私が知る限り、これは次のような非汎用コンテナーでのみ機能しますArray

public StackComposition(Class<T> type)
{
    Object obj = Array.newInstance(type, 10);
}
4

2 に答える 2

5

コードには 2 つの問題があります。

new不正なキーワードでインターフェイスをインスタンス化しようとしています。ArrayList代わりに(または を実装するクラス)のオブジェクトをインスタンス化する必要がありますList

String次に、コンストラクターへの参照を渡すことはできません。

したがって、コードで使用する必要があるのは次のとおりです。

stackList = new ArrayList<T>();

またはstackList = new ArrayList<T>(10);、初期サイズを指定する場合(リストを初期化するサイズにstackList置き換えます)。10

于 2013-02-27T22:09:08.680 に答える
0

純粋に教育的な観点から、演習は、特定のメソッドをより一般的な型の含まれているインスタンスに転送することによって構成を説明することを意図していた可能性があります。必要なメソッドのみを公開する必要があり、内部で使用される具象型は必要に応じて変更できます。

import java.util.Deque;
import java.util.LinkedList;

public class MyStack<T> {

    private Deque<T> deque = new LinkedList<T>();

    public void push(T item){
        deque.push(item);
    }

    public T pop() {
        return deque.pop();
    }

    public static void main(String[] args) {
        MyStack<Integer> stack = new MyStack<>();
        stack.push(42); // OK
        stack.addFirst(0); // no such method
    }
}
于 2013-02-28T03:32:13.237 に答える