で動作するようにする方法は、次のインタフェースを考えてみましょう:ジェネリックと可変引数 - サブクラス
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?の重複のですか?
私はそうは思わない。多分私の質問に答えるために必要な情報はこの記事に含まれていますが、私は同じ質問ではないと思います。
「T」をそのクラスに定義した方法と「some warning」の代わりに正確な警告を含むクラスの完全な定義を表示してください。 – RealSkeptic
実験を複製しようとすると逆の結果が表示されます。コードは 'Integer ...'でコンパイルされ、 'Number ... 'でコンパイルされません。実装クラスのコード全体を投稿してください。 –
*「私の質問に答えるために必要な情報がこの投稿に含まれているのかもしれません」*これが欺瞞を定義するものです。あなたは2年以上ここにいるので、それを知るべきです。 – Tom