1) Why obj4, obj6, obj7 give compile error, and obj5 is fine? Where can I read about rules, regulating using such generic coupled outer-inner classes? I found nothing directly to the point.
When I don't supply any type argument for Inner class in obj3 it is fine (while Inner class needs to be given something for for its fld3 field of type S), but when I do the same and do not supply type for Outer class - it does not compile (obj4) - though Object could be implied...
2) Besides, why obj10 compiles fine, but obj11 fails? In obj10 line I also write outerInstance.new Inner<>(), implying for Inner that S is Object. But this is not problem for inner, but same "trick" is problem for Outer...
//in Class A of package com.sth
public class MyGen<T> {
T fld1;
class GenInner<S> {
T fld2;
S fld3;
}
// within main of Class Driver of same package com.sth
MyGen.GenInner obj1 = new MyGen<String>().new GenInner<Integer>();
MyGen.GenInner obj2 = new MyGen<String>().new GenInner<>();
MyGen.GenInner obj3 = new MyGen<String>().new GenInner();
//MyGen.GenInner obj4 = new MyGen().new GenInner<String>(); //ERR !
MyGen.GenInner obj5 = new MyGen<>().new GenInner<String>();
//MyGen<String>.GenInner obj6; // ERR
//MyGen.GenInner<String> obj7; // ERR
MyGen<String>.GenInner<Integer> obj8;
MyGen.GenInner obj9;
MyGen<String>.GenInner<Integer> obj10 = new MyGen<String>().new GenInner<>();
//Type mismatch: cannot convert from MyGen<Object>.GenInner<Integer> to MyGen<String>.GenInner<Integer>
//MyGen<String>.GenInner<Integer> obj11 = new MyGen<>().new GenInner<Integer>(); // ERR!
These answers relate to my question, but do not provide any clue: