Обычно, если не будет никакого универсального типа на внешнем классе вы могли бы написать такой код:
Outer outer = new Outer();
Inner inner = outer.new Inner();
, потому что каждый метод внутреннего класса уже знает, какие типы следует использовать.
Но ситуации немного сложнее, если внешний класс использует общие типы. Поскольку внутренний класс имеет доступ ко всем членам своего внешнего класса (или классов), он также должен знать об универсальном типе, используемом во внешних классах, для обеспечения безопасности типа при манипулировании общими значениями.
Посмотрите на этот код:
class Outer<T> {
private T someValue;
class Inner {
T getOuterValue(){
return someValue;
}
void setOuterValue(T value){
someValue=value;
}
}
//rest of code
}
Это означает, что экземпляр класса Inner
также зависит от общего типа от его внешнего класса (ов).Именно поэтому при создании ссылки на внутренний класс вам нужно явно использовать внешний класс с родовым типом, написав его как
Outer<String> outer = new Outer<>();
Outer<String>.Inner inner = outer.new Inner();
^^^^^^^^^^^^^
или явно говорят, что внешний класс использует raw type (который не рекомендуется), как
Outer.Inner inner = outer.new Inner();
Итак, чтобы сделать ваш код работать вам нужно:
добавить о тип класса макс (предпочтительно с его общим типом)
invoke конструктор внутреннего класса на экземпляр внешнего класса (так же, как нестатические методы не могут быть вызваны без примера, должны создаваться нестатические (внутренние) классы используя внешний экземпляр класса)
InnerClassGenerics<String>.Innerclasss<String> innerclass = icg.new Innerclasss<>();
^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^
point 1 point 2
Также вы не должны давать одинаковые имена общим типам во вложенных классах и ее внешние классы, как в этом случае
public class InnerClassGenerics<T>{
class Innerclasss<T>{
...
}
}
потому T
от Innerclasss
скрываетT
от своего внешнего класса InnerClassGenerics
(не то, что он вызывает текущую проблему, но это может сделать вашу жизнь трудной позже).
Это не имеет ничего общего с дженериками, просто говоря. – Smutje
Возможный дубликат [внутренний класс Java и статический вложенный класс] (http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class) – Smutje
Ваш параметр типа '' во внутреннем классе скрывает '' от внешнего класса. В любом случае вы должны исправить свой пример (вы пытаетесь создать нестатический внутренний класс из синего, без использования какого-либо экземпляра внешнего класса). –
Pshemo