【问题标题】:Inheritance of generic typed method from abstract class -- convert to specific type从抽象类继承泛型类型方法——转换为特定类型
【发布时间】:2012-10-03 20:43:18
【问题描述】:

(在 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)

但这不符合从ConnectionProcessor 覆盖processPage 的要求。为什么是这样?如何获得所需的行为?我认为在AlbumProcessor 中我可以在任何地方插入&lt;Album&gt; ConnectionProcessor&lt;T&gt;,但事实并非如此。

【问题讨论】:

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


    【解决方案1】:

    试试

    //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&lt;T&gt; 的原始版本并引入一个新的形式类型参数 - Album(如 T),在这种情况下它不是实际的类型参数。

    【讨论】:

    • 谢谢,我认为你回答了我的“为什么这是”部分问题是最好的
    【解决方案2】:

    那是因为你没有将你的超类泛型类型T绑定到Album

    相反,这是你应该做的:

    public class AlbumProcessor extends ConnectionProcessor<Album>
    

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

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

    【讨论】:

      【解决方案3】:
      public class AlbumProcessor extends ConnectionProcessor<Album>
      

      【讨论】:

        【解决方案4】:

        试试:-

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

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

        【讨论】:

          【解决方案5】:

          这样的事情怎么样。

          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";
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-01-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-05
            • 2023-04-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多