Skip to content
Advertisement

Which import should be considered?

Consider the following code snippet.

package spoon;

import rx.Observable;
import java.util.*;

public class Test {
    public void test() {
        Observable o = new Observable();
    }
}

This code compiles well with Java 11 even though I thought it should not. Observable is also a java class in java.util and I do not understand how the compiler knows whether to use Observable from java.util or my custom package rx.

Note that java.util.Observable was deprecated in Java 9, however, I don’t think so it should have any effect on imports.

Advertisement

Answer

The single name import wins over the wildcard (called “import-on-demand” by the standard).

To cite chapter and verse:

https://docs.oracle.com/javase/specs/jls/se11/html/jls-7.html#jls-7.5.2

“The declaration might be shadowed by a single-type-import declaration of a type whose simple name is…”

https://docs.oracle.com/javase/specs/jls/se11/html/jls-6.html#jls-6.4.1

“A type-import-on-demand declaration never causes any other declaration to be shadowed. “

User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement