Bu, bir üçüncü taraf kütüphane API'sinden gerçek dünyadaki bir örnektir, ancak basitleştirilmiştir.
Oracle JDK 8u72 ile derlenmiştir
Bu iki yöntemi düşünün:
<X extends CharSequence> X getCharSequence() {
return (X) "hello";
}
<X extends String> X getString() {
return (X) "hello";
}
Her ikisi de "denetlenmeyen bir oyuncu kadrosu" uyarısı veriyor - nedenini anladım. Beni şaşırtan şey neden arayabilirim
Integer x = getCharSequence();
ve derler? Derleyici Integer
bunun uygulanmadığını bilmelidir CharSequence
. Çağrı
Integer y = getString();
hata veriyor (beklendiği gibi)
incompatible types: inference variable X has incompatible upper bounds java.lang.Integer,java.lang.String
Birisi bu davranışın neden geçerli sayıldığını açıklayabilir mi? Nasıl faydalı olur?
İstemci bu çağrının güvensiz olduğunu bilmiyor - istemcinin kodu uyarı vermeden derleniyor. Derleme neden bu konuda bir uyarı vermiyor / hata vermiyor?
Ayrıca, bu örnekten farkı nedir:
<X extends CharSequence> void doCharSequence(List<X> l) {
}
List<CharSequence> chsL = new ArrayList<>();
doCharSequence(chsL); // compiles
List<Integer> intL = new ArrayList<>();
doCharSequence(intL); // error
Geçmeye çalışmak List<Integer>
beklendiği gibi bir hata veriyor:
method doCharSequence in class generic.GenericTest cannot be applied to given types; required: java.util.List<X> found: java.util.List<java.lang.Integer> reason: inference variable X has incompatible bounds equality constraints: java.lang.Integer upper bounds: java.lang.CharSequence
Bu bir hata olarak rapor edilirse neden Integer x = getCharSequence();
olmasın?
Integer x = getCharSequence();
derlenecek, ancak RHS dökümüInteger x = (Integer) getCharSequence();
derlenemedi