Unchecked conversion spec

Tagir Valeev amaembo at gmail.com
Wed Jan 25 13:10:57 UTC 2023


Hello!

Could anyone please look into this? Thanks!

On Mon, Jan 16, 2023 at 5:17 PM Tagir Valeev <amaembo at gmail.com> wrote:
>
> Hello!
>
> I have trouble understanding the unchecked conversion section of JLS
> (5.1.6.2)[1].
> I have the following code:
>
> import java.util.function.Supplier;
>
> public class Test {
> static class Box<T extends CharSequence> implements Supplier<T> {
> @Override
> public T get() {
> return null;
> }
> }
>
> <S extends Supplier<String>> void typeArg(S s) {
> Box<String> b = (Box<String>) s;
> }
> }
>
> javac with -Xlint:all compiles it without unchecked warning (tried
> various versions from JDK 11 to JDK 20ea, the behavior is the same).
> The spec says:
>
> The unchecked narrowing reference conversions are as follows:
>
> A narrowing reference conversion from a type S to a parameterized
> class or interface type T is unchecked, unless at least one of the
> following is true:
> - All of the type arguments of T are unbounded wildcards.
> - T <: S, and S has no subtype X other than T where the type arguments
> of X are not contained in the type arguments of T.
>
> In my example, T = Box<String> and S = S. To my understanding, "All of
> the type arguments of T are unbounded wildcards." is false (<String>
> is bounded), and Box<String> is not a subtype of S, so "T <: S" is
> wrong. This means that this conversion should be unchecked and a
> warning should be issued.
>
> I feel that javac behavior is correct. Probably I don't understand the
> spec correctly. Could you please help me with this?
>
> Thank you in advance,
> Tagir Valeev.
>
> [1] https://docs.oracle.com/javase/specs/jls/se19/html/jls-5.html#jls-5.1.6.2


More information about the compiler-dev mailing list