泛型和Varargs - 如何使用子类

时间:2017-02-25 09:23:41

标签: java generics variadic-functions

考虑以下界面:

public interface Addresses <T extends Number> {

    T[] getAddress();

    void setAddress(T...address);
}

编译器接受此实现:

@Override
public Integer[] getAddress() {.........}

@Override 
public void setAddress(Number... address)  {.........} //some warning

但不接受:

@Override 
public void setAddress(Integer... address)  {.........}

为什么我不能用Integer varargs覆盖T varargs,就像我用Integer []覆盖T []一样?
如何覆盖setaddress以便它接受整数并保持varargs的灵活性?


编辑:添加两个完整的类:

public interface Addresses <T extends Number> {

    T[] getAddress();
    void setAddress(T...address);//warning: Type safety: Potential heap pollution 
}

public class Address implements Addresses{

    public Address() {}

    @Override
    public Integer[] getAddress() {

        return null;
    }

    @Override
    public void setAddress(Integer... address) {
        // Error: The method setAddress(Integer...) of type Address must 
        //override or implement a supertype method
    }

    /*
    @Override
    public void setAddress(Number... address) {
        // No compiler errors   
    }
    */
}


修改:是否与What is a raw type and why shouldn't we use it?重复?我不这么认为。也许回答我的问题所需的信息包含在这篇文章中,但我认为这不是同一个问题。

2 个答案:

答案 0 :(得分:1)

假设您android.support.v4.fragment(否则我无法重现您的错误)。

为什么class NumberAdresses implements Addresses<Number>{有效作为Integer[]的返回类型;因为在覆盖方法时通常允许你使用超类型(这就是所谓的协变返回类型)。

参数不允许这样做。

答案 1 :(得分:1)

由于k5_回答,我发现了什么是错的。不得不使用

public class Address implements Addresses<**Integer**>