请看下面的接口工作:泛型和可变参数 - 如何与一个子类
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可变参数覆盖T可变参数,就像我用Integer []重写T []一样?
如何覆盖setaddress
,以便接受整数并保持可变参数的灵活性?
编辑:加上两个全类:
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?重复?
我不这么认为。也许需要回答我的问题的信息包含在这篇文章中,但我不认为这是同一个问题。
请显示该类的完整定义,包括如何为该类定义'T',以及确切的警告而不是“一些警告”。 – RealSkeptic
试图复制您的实验显示相反的结果。代码用'Integer ...'编译,不能用'Number ...'编译。发布实现类的整个代码。 –
*“也许回答我的问题需要的信息包含在这篇文章中”*这就是定义一个愚蠢的东西。你在这里已经超过2年了,应该知道这一点。 – Tom