D
Daniel Thoma
Hi!
I can't figure out, why casting to a subclass causes an unchecked cast
warning, when a wildcard type is involved, but seems to work in any other
case:
Example:
static class Base<T> { }
static class Derived<T> extends Base<T> { }
<T> void foo() {
Base<? extends CharSequence> base = new Derived<String>();
Derived<? extends CharSequence> derived
= (Derived<? extends CharSequence>) base; // causes warning
Base<T> base2 = new Derived<T>();
Derived<T> derived2 = (Derived<T>) base2;
Base<String> base3 = new Derived<String>();
Derived<String> derived3 = (Derived<String>) base3;
}
Compiler warning:
warning: [unchecked] unchecked cast
found : test.Main.Base<capture#325 of ? extends java.lang.CharSequence>
required: test.Main.Derived<? extends java.lang.CharSequence>
Derived<? extends CharSequence> derived = (Derived<? extends CharSequence>)
base;
Is there an explanation for this behavior?
Daniel
I can't figure out, why casting to a subclass causes an unchecked cast
warning, when a wildcard type is involved, but seems to work in any other
case:
Example:
static class Base<T> { }
static class Derived<T> extends Base<T> { }
<T> void foo() {
Base<? extends CharSequence> base = new Derived<String>();
Derived<? extends CharSequence> derived
= (Derived<? extends CharSequence>) base; // causes warning
Base<T> base2 = new Derived<T>();
Derived<T> derived2 = (Derived<T>) base2;
Base<String> base3 = new Derived<String>();
Derived<String> derived3 = (Derived<String>) base3;
}
Compiler warning:
warning: [unchecked] unchecked cast
found : test.Main.Base<capture#325 of ? extends java.lang.CharSequence>
required: test.Main.Derived<? extends java.lang.CharSequence>
Derived<? extends CharSequence> derived = (Derived<? extends CharSequence>)
base;
Is there an explanation for this behavior?
Daniel