考虑以下界面:
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?重复?我不这么认为。也许回答我的问题所需的信息包含在这篇文章中,但我认为这不是同一个问题。
答案 0 :(得分:1)
假设您android.support.v4.fragment
(否则我无法重现您的错误)。
为什么class NumberAdresses implements Addresses<Number>{
有效作为Integer[]
的返回类型;因为在覆盖方法时通常允许你使用超类型(这就是所谓的协变返回类型)。
参数不允许这样做。
答案 1 :(得分:1)
由于k5_回答,我发现了什么是错的。不得不使用
public class Address implements Addresses<**Integer**>