1

(Javaでの作業)クラス全体でジェネリック型を使用する抽象クラスがあります。

public abstract class ConnectionProcessor<T>
{
    public void process()
    {
        for (List<T> resultsPage : connection)
        {
            processPage(resultsPage);
        }
    }

    protected abstract void processPage(List<T> resultsPage);
}

次の宣言で、上記の抽象クラスを拡張する別のクラスがあります。

public class AlbumProcessor<Album> extends ConnectionProcessor
{
    @Override
    protected void processPage(List resultsPage)
    {
        //Do stuff here specific to Album
    }
}

この宣言は問題なく機能しますが、processPage私は特定のことをしたいAlbumので、使用する必要がないときはキャストを避けようとしています。私はこれをメソッド宣言として優先します:

protected void processPage(List<Album> resultsPage)

processPageただし、これはからオーバーライドするための要件を満たしていませんConnectionProcessor。どうしてこれなの?どうすれば目的の動作を得ることができますか?どこにでもAlbumProcessorプラグインできると思いますが、そうではありません。<Album>ConnectionProcessor<T>

4

5 に答える 5

2

Tこれは、スーパークラスのジェネリック型をにバインドしなかったためですAlbum

むしろ、これはあなたがすべきことです:

public class AlbumProcessor extends ConnectionProcessor<Album>

したがって、(IDEを使用して)メソッドをオーバーライドするprocessPageと、次のようなコードが生成されます。

@Override
protected void processPage(List<Album> resultsPage)
{
    //Do stuff here specific to Album
}
于 2012-10-03T20:45:55.143 に答える
2

試す

//extend prameterized version of ConnectionProcessor<T> with Album as actual type argument
public class AlbumProcessor extends ConnectionProcessor<Album> {

それ以外の

public class AlbumProcessor<Album> extends ConnectionProcessor {

上記を実行すると、ジェネリック型の生のバージョンが拡張ConnectionProcessor<T>され、新しい正式な型パラメーターが導入されますAlbum(Tその場合、実際の型引数ではありません)。

于 2012-10-03T20:48:07.577 に答える
1
public class AlbumProcessor extends ConnectionProcessor<Album>
于 2012-10-03T20:44:49.710 に答える
1

試す: -

public class AlbumProcessor extends ConnectionProcessor<Album>
{
    @Override
    protected void processPage(List<Album> resultsPage)
    {
        //Do stuff here specific to Album
    }
}

スーパークラスを、メソッド宣言のリストに型パラメーターとして指定する型にバインドする必要があります。

于 2012-10-03T20:45:17.230 に答える
1

このようなものはどうですか。

import java.util.List;

public abstract class ConnectionProcessor<T>
{
    public void process()
    {
        System.out.println("Hello");
    }

    protected abstract void processPage(List<? extends T> resultsPage);
}

...

public class ProcessorImpl extends ConnectionProcessor<Album> {

    protected void processPage(List<? extends Album> resultsPage) {
        for(Album result : resultsPage){
            System.out.println(result.getAlbumName());
        }
    }

}

...

public class Album {
    public String getAlbumName(){
        return "Sweet Smooth SOunds of the 70's";
    }
}
于 2012-10-03T21:11:05.497 に答える