Избавьтесь от предупреждений в списке.toArray () - PullRequest
3 голосов
/ 14 декабря 2010

Еще один из тех, как мне сделать toArray () без вопросов с предупреждениями, но он отличается от большинства из тех, что выложены здесь.

Как переписать реализацию метода (без изменения сигнатуры метода), чтобы он компилировался без предупреждения?

Очевидная трудность заключается в том, что информация о классе для T недоступна во время выполнения. Тем не менее, возвращаемый тип также является стертым во время выполнения, поэтому на самом деле нет причин, по которым это невозможно сделать. Итак, как мне это сделать, если вы хотите обеспечить безопасность типов во время компиляции?

Спасибо

<T> GenericClass<T>[] toGenericArray(List<GenericClass<T>> list) {
    return list.toArray(new GenericClass[0]);
}

Ответы [ 2 ]

2 голосов
/ 14 декабря 2010

Вы не можете. Поскольку массивы ковариантны, невозможно обеспечить безопасность времени компиляции для массива, который содержит параметризованный тип. (если вы не используете <?>, что является законным.)

Это всегда будет законно:

GenericClass<String>[] array = new GenericClass[1];
Object[] brokenArray = array;
brokenArray[0] = new GenericClass<Integer>();
String value = array[0].getGenericValue(); //kaboom

Компилятор не может защитить вас от этого, поэтому вынуждает вас признать / подавить появление предупреждения.

1 голос
/ 14 декабря 2010

Вы можете добавить аннотацию @SuppressWarnings("unchecked").Это не меняет сигнатуру метода и позволяет вам делать «небезопасные» действия без предупреждения.Ваш код действительно безопасен, поэтому можно подавить предупреждение.Обратите внимание, что, согласно ответу @ Affe, после вашего возвращения могут произойти плохие вещи, но вы, безусловно, сможете правильно реализовать свой метод.

Платформа Java Collections делает подобные вещи внутренне, так что это не просто взлом.Ну, это это взломать, но это нормально взломать.Ну, это не так хорошо, но это работает.Любопытное.

...