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)

但这不符合覆盖processPagefrom的要求ConnectionProcessor。为什么是这样?如何获得所需的行为?我会认为我可以在任何地方都AlbumProcessor插入,但事实并非如此。<Album>ConnectionProcessor<T>

4

5 回答 5

2

那是因为您没有将超类 Generic 类型绑定TAlbum.

相反,这是你应该做的:

public class AlbumProcessor extends ConnectionProcessor<Album>

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

@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(like 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
    }
}

您需要将您的超类与您想要作为类型参数提供给您的方法声明中的 List 的类型绑定..

于 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 回答