2017-02-25 17 views
-1

请看下面的接口工作:泛型和可变参数 - 如何与一个子类

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?重复?
我不这么认为。也许需要回答我的问题的信息包含在这篇文章中,但我不认为这是同一个问题。

+0

请显示该类的完整定义,包括如何为该类定义'T',以及确切的警告而不是“一些警告”。 – RealSkeptic

+0

试图复制您的实验显示相反的结果。代码用'Integer ...'编译,不能用'Number ...'编译。发布实现类的整个代码。 –

+0

*“也许回答我的问题需要的信息包含在这篇文章中”*这就是定义一个愚蠢的东西。你在这里已经超过2年了,应该知道这一点。 – Tom

回答

1

假设你没有class NumberAdresses implements Addresses<Number>{(否则我不能重现你的错误)。

那么为什么Integer[]作为getAdresses()的返回类型有效;因为在重写方法时通常允许使用超类型(即所谓的协变返回类型)。

这是不允许的参数。

1

我发现k5_答案有什么不对。必须使用

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