11
public abstract class AbstractTool<AT extends AbstractThing> {
    protected ArrayList<AT> ledger;
    public AbstractTool() {
        ledger = new ArrayList<AT>();
    }

    public AT getToolAt(int i) {
        return ledger.get(i);
    }

    // More code Which operates on Ledger ...

}

public class Tool<AT extends AbstractThing> extends AbstractTool {
    public Tool() {
        super();
    }
}

ATのジェネリックをToolAbstractToolコンストラクターに渡すためにsuperを正しく呼び出すにはどうすればよいですか?

AT私が宣言するときに何を選んだとしてもTool(Say、Tool<Thing>)、私は常にのAbstractThing代わりに戻ってくるようですThing。これはジェネリックの目的を打ち負かすようです...

ヘルプ?

4

3 に答える 3

19
public class Tool<AT extends AbstractThing> extends AbstractTool<AT> {

つまり、ジェネリックを使用して何かを拡張または実装する場合は、それらのジェネリック引数を定義することを忘れないでください。

于 2009-09-13T15:03:25.003 に答える
3

むしろそうあるべきではありません Tool<AT extends...> extends AbstractTool<AT>か?

于 2009-09-13T15:03:56.277 に答える
0

おそらくあなたが望むのは次のとおりだと思います:

   public abstract class AbstractTool<AT extends AbstractThing> {
        protected List<AT> ledger = new ArrayList<AT>();

        public AT getToolAt(int i) {
            return ledger.get(i);
        }

        // More code Which operates on Ledger ...

    }

    public class Tool extends AbstractTool<Thing> {
        // Tool stuff ...
    }

は具象クラスであるためTool、それ自体をパラメーター化する必要はありません。at宣言を初期化する場合(ああ、インターフェイスにプログラムすることを忘れないでください)、コンストラクターは必要ありません。また、List保護されているため、サブクラスは直接アクセスできます。

于 2009-09-13T17:34:13.603 に答える