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

时间:2015-12-10 11:23:38

标签: java generics inheritance polymorphism override

说我有一个班级

$.ajax({
    url:"test.php",
    type:"POST",
    dataType:"json",
    data:{

      }
 }).done(function(msg){
    $( "#modal-content" ).html(msg);

   });

是否可以执行类似

的操作
abstract class A {
    ArrayList<?> l;

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

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

3 个答案:

答案 0 :(得分:0)

您需要制作A generic:

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

然后让B成像:

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

  

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) {

        //...
    };
}

这里编译器将执行类型擦除,签名将完全相同。