Внутренние классы также имеют доступ к непатентованным типу своего внешнего класса. Допустим, что мы имеем
class Foo<T> {
class Point {
float x, y;
T value;
T getValue(){
return value;
}
}
}
При создании экземпляра Foo
как
Foo<String> f = new Foo<>();
мы можем создать экземпляр своего внутреннего класса на основе его внешнего экземпляра как
Point p = f.new Point();
// or
//Foo<String>.Point p = f.new Point
// if we are creating it for instance outside of Foo class
и компилятор знаю, что p.getValue()
возвращает String, поэтому он позволяет нам использовать p.getValue().charAt(0)
.
Сейчас проблема заключается в том, что generic type can't be used in any part of array type, что означает, что мы не можем использовать:
T[size]
.
Foo<T>[size]
- или даже не
Foo<T>.Point[size]
Последний пример, кажется, ваш случай, потому что
Point[] points = new Point[3];
является эквивалентом
Point[] points = new Foo<T>.Point[3];
// Foo<T> is type of outer instance on which you are invoking new
У вас есть несколько вариантов решения этой проблемы.
Вы можете явно сказать, что вы не хотите использовать общий тип, написав
Point[] points = new Foo.Point[3];// we got rid of <T>
, но не делают этого, потому что raw types are evil.
Лучшее решение - избегать массивов и использовать коллекцию, которая поддерживает дженерики, такие как List<Point>
.
List<Point> points = new ArrayList<>();
Но, вероятно, лучшим решением будет просто избавиться от зависимости от T
от внешнего класса Foo
. Это может быть достигнуто путем создания вашего внутреннего класса static, а это означает, что ему не потребуется экземпляр его внешнего класса, поэтому ему не нужно знать, какой общий тип используется им.
Таким образом, вы можете просто использовать
static class Point {
float x, y;
}
и теперь
Point[] points = new Point[3];
будет компилироваться.
класс 'Точка статический {...'. Похоже, что ваш внутренний класс просто предназначен для хранения 'x' и' y', и на самом деле не нужен скрытый указатель на экземпляр 'Foo'. Если я прав, то это должен быть вложенный класс, а не внутренний класс. –
ajb
@ajb Это должен быть ответ (потому что это ответ). –
Интересно, почему 'Point p = new Point()' компилируется отлично, а 'Point [] points = new Points [3]' does not. – Pshemo