2015-10-19 4 views
2

Я немного нового в Java, но я действительно запутался, почему эти два «эквивалентные» заявления бросают различные ошибки:Частной конкретизация дженерик

public class SampleArray<T> implements Grid<T> { 
    public int x; 
    public int y; 
    private List<List<T>> grid = new ArrayList<List<T>>(); 

    public SampleArray(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

Это прекрасно работает, от понимания его конкретизирует класс, который принимает обобщенный тип T и имеет свойства х, у, и список частной собственности, которая принимает список и T

public class SampleArray<T> implements Grid<T> { 
    public int x; 
    public int y; 
    private List<List<T>> grid; 

    public SampleArray(int x, int y) { 
     this.x = x; 
     this.y = y; 
     List<List<T>> this.grid = new ArrayList<List<T>>(); 
    } 
} 

Это дает мне ошибку, а именно:

Syntax Error insert ";" to complete LocalVariableDeclarationStatement; 
Syntax Error insert "VariableDelarators" to complete LocalVariableDeclaration 

Прямо рядом с угловым кронштейном на T>> this.grid. Почему я получаю эту ошибку? Разве они не эквивалентны, один экземпляр создается в разных местах? Интерфейс Grid - это всего лишь общий интерфейс

+1

Это не имеет ничего общего с дженериками. Выполнение 'int this.x = x;' также недопустимо для Java. Почему, по-вашему, вам нужно повторить тип поля при инициализации this.grid? –

+0

Вау ... я чувствую себя так ... тупой. Большое спасибо! –

ответ

3

Вы снова определяете сетку в конструкторе. Попробуйте это

public SampleArray(int x, int y) { 
    this.x = x; 
    this.y = y; 
    this.grid = new ArrayList<List<T>>(); 
} 

вместо этого. Он будет объявлять сетку в вашем классе как частное поле. Инициализация выполняется в конструкторе.

Линия

private List<List<T>> grid = new ArrayList<List<T>>(); 

определяет и инициализирует сетку в один оборот.

6

Вторая часть кода имеет плохой синтаксис. Вы не должны повторно указывать тип данных при инициализации this.grid; компилятор подумает, что вы объявляете локальную переменную, а this не может использоваться при создании локальной переменной.

Удалить тип данных для переменной.

this.grid = new ArrayList<List<T>>();