【问题标题】:Can a subclass in Java override a set method and make the argument type more specific?Java 中的子类可以覆盖 set 方法并使参数类型更具体吗?
【发布时间】:2015-12-10 11:23:37
【问题描述】:

假设我有一堂课

abstract class A {
    ArrayList<?> l;

    public void setList(ArrayList<?> l) //set the list
}

有没有可能做类似的事情

class B extends A {
    public void setList(ArrayList<? extends Foo> l) //Set the list }

我基本上想指定一个带有参数化字段的抽象类,其中从第一个类继承的类可以更具体地指定字段的类型,以便它必须扩展一些其他类型。

【问题讨论】:

  • 没有。因为它必须接受所有可以传递给new A().setList()的参数。
  • 我想用你的方式做同样的事情是不行的
  • 没有。它将被视为重载,并隐藏基类方法。不作为替代。
  • @EJP 不会重载也不会隐藏,会因为名字冲突导致编译时错误。

标签: java generics inheritance polymorphism overriding


【解决方案1】:

Java 中的子类能否覆盖 set 方法并使参数类型更具体?

没有。重写方法时,签名(名称和参数类型)在类型擦除后必须相同。有关详细信息,请参阅 JLS 8.4.2。

我基本上想指定一个带有参数化字段的抽象类,其中从第一个类继承的类可以更具体地指定字段的类型,以便它必须扩展一些其他类型。

abstract class A<T> {

    public abstract void setList(ArrayList<? extends T> l);
}

class B extends A<Integer> {

    @Override
    public void setList(ArrayList<? extends Integer> l) {

        //...
    };
}

这里编译器将执行类型擦除,并且签名将是相同的。

【讨论】:

    【解决方案2】:

    您需要将 A 设为通用:

    abstract class A<T> {
      abstract void setList(List<? extends T> list);
    }
    

    然后使 B 类似于:

    class B extends A<Foo> {
      @Override void setList(List<? extends Foo> list) { ...}
    }
    

    【讨论】:

      【解决方案3】:

      如果您生成基类,它将起作用:

      abstract class A<T> {
          ArrayList<T> l;
      
          public void setList(ArrayList<T> l) {//set the list
          }
      }
      
      class B<T extends Foo> extends A<T> {
          @Override
          public void setList(ArrayList<T> l) {//Set the list 
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-22
        • 1970-01-01
        相关资源
        最近更新 更多