从抽象类继承泛型类型方法 - 转换为特定类型

时间:2012-10-03 20:43:18

标签: java generics override abstract-class type-bounds

(在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>插入{{1}},但事实并非如此。

5 个答案:

答案 0 :(得分:2)

那是因为您没有将超类通用类型T绑定到Album

相反,这是你应该做的:

public class AlbumProcessor extends ConnectionProcessor<Album>

因此,当您覆盖方法processPage时,(使用IDE),它将生成如下代码:

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

答案 1 :(得分: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),这不是实际类型那种情况下的论点。

答案 2 :(得分:1)

public class AlbumProcessor extends ConnectionProcessor<Album>

答案 3 :(得分:1)

尝试: -

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

您需要在方法声明中将您的超类与您想要作为类型参数的类型绑定到List中。

答案 4 :(得分: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";
    }
}