Niclas Hedhman a écrit : > Gang and especially the Type System experts.... > > I am struggling to get the TypeLookup class converted to Stream API, and it > is because the Java type system (or at least the one built into IntelliJ) > to behave strangely.
IDEs that don't directly rely on javac (Eclipse, IDEA) have history of showing errors that javac don't show. Especially when new javac versions are released, IDE-specific compilers tends to lag. I don't know what's IDEA status WRT this. IIRC there was a setting to tell it to use in-process javac. > For instance; I have the following method in ModuleInstance > > public Stream<ModelModule<ObjectDescriptor>> visibleObjects( > Visibility visibility ) > > And trying to access it from TypeLookup > > Stream<ModelModule<? extends ModelDescriptor>> moduleObjects = > moduleInstance.visibleObjects( module ); > > But that tells me that the moduleObjects are of the wrong type, and should > be Stream<ModelModule<ObjectDescriptor>>. I can also change the > visibleObjects() method to > > public Stream<ModelModule<? extends Descriptor>> visibleObjects( > Visibility visibility ) > > without compile error in TypeLookup NOR in ModuleInstance. What magic > happens (or not) in this distinction. I tried to reproduce locally and javac behave just has you described. So IDEA does a good job here. Here is what works; public Stream<ModelModule<ObjectDescriptor>> visibleObjects(Visibility visibility) Usage; Stream<? extends ModelModule<? extends ModelDescriptor>> visibleObjects = lookup.visibleObjects(); So, one need to chain the '? extends T' when implicitely casting on 'deep' generics ; eg: List<List<Integer>> someLists = new ArrayList<>(); List<List<Number>> numberLists = someLists; // Fails to compile! List<? extends List<? extends Number>> deepGenericCast = someLists; // OK HTH Cheers
