2015-10-10 4 views
0

Я потратил пару дней на это, и, к сожалению, я не могу найти ответ на этот вопрос, который не является ни 1. Не применимо к моему использованию, или 2. Требовать большой объем знаний эта тема уже Так вот мой вопрос: в Java, некоторые записи, как классы (например, ArrayList) может быть установлен типом при создании нового экземпляра из них:Java - создать класс экземпляра типа?

ArrayList<Integer> list = new ArrayList<Integer>(); 

Так что мой вопрос , как вы это делаете для своего класса? Я читал немного в ArrayList класс библиотеки, и я заметил, что они используют

<E> 

Я думаю, что я помню, это означает элемент, но я мог бы сделать материал.

У меня есть класс с именем сеть (для создания сетки и всех операций сетки для моих карт и прочего)

public class Grid { 
    private int sizeX; 
    private int sizeY; 
    private double[][] values; 

    public Grid(){ 
     this.sizeX = 10; 
     this.sizeY = 10; 
     this.values = new double[this.sizeX][this.sizeY]; 
     this.clear(); 
    } 

    public Grid(int width, int height){ 
     this.values = new double[width][height]; 
     this.sizeX = width; 
     this.sizeY = height; 
    } 

    public Grid(Grid sample){ 
     this.values = sample.toArray(); 
     this.sizeX = sample.sizeX; 
     this.sizeY = sample.sizeY; 
    } 

    public int getSizeX(){ 
     return this.sizeX; 
    } 

    public int getSizeY(){ 
     return this.sizeY; 
    } 

    public Grid copy(){ 
     return new Grid(this); 
    } 

    public double[][] toArray(){ 
     return this.values.clone(); 
    } 

    public void clear(){ 
     for(int rows=0; rows<this.sizeY; rows++){ 
      for(int cols=0; cols>this.sizeX; cols++){ 
       this.values[cols][rows] = 0; 
      } 
     } 
    } 

    public boolean isSquare(){ 
     return (this.values.length == this.values[0].length); 
    } 

    /*---------------------- Grid Operations Begin Here ----------------------*/ 


} 

Я пропустил операцию сетки, потому что я не чувствую, что они важны в этом случае , Прямо сейчас, чтобы создать новую сетку, я делаю

Grid map = new Grid(); 

И он создает сетку из двухместных. Но я не хочу этого делать - я бы хотел создать сетку целых чисел, поплавков, удвоений, символов или строк, и я хотел бы иметь форму:

Grid<Double> map = new Grid<Double>(); 
or 
Grid<String> map = new Grid<String>(); 

а потом, что изменить тип данных некоторых из методов возврата и переменных (например, двойных [] [] значений в строку [] [] значение)

Так как я бы переписать свой код для «значений» переменная должна быть любой из них? Я бы просто сделал его «частным объектом [] []» вместо этого? И как я могу проверить, какой тип данных? И, конечно, мои операции (плюс метод clear() »зависят от типа данных, поэтому как бы я мог проверить, что это такое (например, установить clear() для установки значений в 0, если int, но «", если String, или иметь метод «toArray()» из Integer, Float, String, Char или Double?

Я понятия не имею, как эти элементы или типы работают сейчас, я хотел бы изучить его довольно быстро, поэтому, пожалуйста, ответьте на полные куски кода и его описания!

EDIT: У меня была небольшая, вероятно, глупая идея. Я бы инициализировал вещи как объекты, а затем отбросил их на работу E? Например:

public class Grid<E>{ 
    private Object[][] values; 

    public Grid(){ 
     this.sizeX = 10; 
     this.sizeY = 10; 
     this.values = new Object[this.sizeX][this.sizeY]; 
     this.clear(); 
    } 

    public E toArray(){ 
     return (E[][]) this.values.clone(); 
    } 

    public E get(int x, int y){ 
     return (E) values[x][y]; 
    } 

    public void set(int x, int y, E value){ 
     this.values[x][y] = value; 
    } 
} 

Если вышеуказанное будет работать/почти работать, не могли бы вы рассказать мне о каких-либо проблемах, которые я мог бы иметь с ним? Если нет, пожалуйста, проигнорируйте его и ответьте на исходный вопрос: D

+1

Не существует ярлыка вокруг обучения дженерикам.В ответ вы получили ссылку на учебник, но некоторые примечания: (1) Дженерики не являются ответом, если у вас есть методы, связанные с конкретным типом (например, если тип double, выполните расчет. type - строка, найдите подстроку). Они предназначены для классов, которые должны иметь одинаковые операции для всех разрешенных типов. (2) Дженерики и массивы не идут хорошо вместе. (3) В основном нет способа проверить, что такое базовый тип общего класса. – RealSkeptic

+0

Я понял, что у меня была проблема. Теперь, когда я знал, что это называется Generics, мне удалось заставить все работать. Что заставляет вас говорить, что Generics and Arrays не сочетаются вместе? –

+0

См. Http://stackoverflow.com/q/1817524/4125191, например. – RealSkeptic

ответ

0

Учебник Java по дженерикам объясняет ответ лучше, чем я мог. Пожалуйста, см https://docs.oracle.com/javase/tutorial/java/generics/index.html

По сути, вы бы начать:

public class Grid<E> { 
    private int sizeX; 
    private int sizeY; 
    private E[][] values; 

замена 'двойной' с 'Е' везде, где он появляется.

Смежные вопросы