2014-01-09 3 views
1

Привет, я делаю ревизию предстоящего теста, и я столкнулся с проблемой, с которой у меня проблемы.Общая очередь с использованием массива

Мне нужно изменить этот код http://pastebin.com/ED2A7VWy, чтобы дать общую реализацию очереди. Проблема в том, что в очереди используется массив, и по какой-то причине дженерики, похоже, не играют хорошо с массивами. Я пробовал:

public class Queue<E>{ 
    private E[] eArray = new E[5]; 
... 

} 

но это не работает.

+0

http://stackoverflow.com/q/2927391/738746 –

ответ

2

В ролях массив вместо:

@SuppressWarnings("unchecked") 
private E[] eArray = (E[])new Object[5]; 

Вы можете прочитать here, почему это не допускается.

+0

Благодаря это хорошо работало, реализация Javas дженерик действительно странно. – user2320239

+0

Если вы это сделаете, вам нужно не возвращать 'eArray' вне класса, как тип' E [] '. – newacct

-2

Вы можете сделать это - не подавляя предупреждения - не отливки:

public class Objects { 

    // Call without a second parameter to get an array of the specified type with the specified length. 
    public static <T> T[] newArray(int length, T... empty) { 
     return Arrays.copyOfRange(empty, 0, length); 
    } 
} 

public class Test<T> { 

    public void test() { 
     // Only specify the length - Java creates an empty one for the varargs param. 
     T[] demo = Objects.<T>newArray(5); 
     System.out.println(Arrays.toString(demo)); 
    } 
+0

как уместно на вопрос? Вы также можете использовать 'String [] stringings = new String [5];' – newacct

+0

@newacct - это способ создания массива родового типа без кастования или пресечения предупреждений. – OldCurmudgeon

+0

Он не создает массив общего типа. Вы недопонимаете, что он делает. A 'String []' создается в 'main' и передается внутри, и метод просто создает другой массив того же типа времени выполнения. – newacct

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