2017-02-25 12 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) {.........} 

T []をInteger []で上書きするのと同じ方法で、なぜTのvarargsをIntegerのvarargsで上書きできないのですか?
setaddressをオーバーライドすると、整数を受け入れ、可変範囲の柔軟性を保つことができますか?


編集:追加する2つの完全なクラス:

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」をそのクラスに定義した方法と「some warning」の代わりに正確な警告を含むクラスの完全な定義を表示してください。 – RealSkeptic

+0

実験を複製しようとすると逆の結果が表示されます。コードは 'Integer ...'でコンパイルされ、 'Number ... 'でコンパイルされません。実装クラスのコード全体を投稿してください。 –

+0

*「私の質問に答えるために必要な情報がこの投稿に含まれているのかもしれません」*これが欺瞞を定義するものです。あなたは2年以上ここにいるので、それを知るべきです。 – Tom

答えて

1

class NumberAdresses implements Addresses<Number>{とした場合(そうでないとエラーは再現できません)。

なぜgetAdresses()の返品タイプとしてInteger[]が有効ですか。メソッドをオーバーライドするときにスーパータイプを使用することが一般に許可されているからです(これは、共変リターンタイプと呼ばれます)。

これはパラメータでは許可されていません。

1

私はk5_答えのおかげで何が間違っているのか分かりました。使用する必要がありました

public class Address implements Addresses<**Integer**> 
関連する問題