Создание универсального типа данных не проверено или небезопасно - PullRequest
0 голосов
/ 19 апреля 2019

Я пытался создать новый тип данных с обобщениями, но компилятор javac постоянно говорит мне

"Note: MyStack.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
, when I try to recompile it with the option -Xlint, 
"MyStack.java:8: warning: [unchecked] unchecked cast
        data = (T[]) new Object[5];
                 ^
  required: T[]
  found:    Object[]
  where T is a type-variable:
    T extends Object declared in class MyStack
1 warning

.Что я должен сделать, чтобы избежать этого предупреждения?

public class MyStack<T> {

    int index;
    private T[] data;

    public MyStack() {
        index = 0;
        data = (T[]) new Object[5];
    }

    public void push(T input) {
        data[index++] = input;
    }

    public T pop() {
        return data[--index];
    }

}

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Массив имеет отдельный тип во время выполнения.Если вы создаете массив Object, то есть его постоянный тип времени выполнения:

Object[] data = new Object[5];
System.out.println(data.getClass());    // Prints class [Ljava.lang.Object;
  • Если вы создаете массив String, постоянный тип времени выполнения массива - [Ljava.lang.String;.

и т. Д.

Универсальные типы не существуют во время выполнения.Они являются механизмом безопасности типов, который полностью обеспечивается компилятором.Это означает, что T во время выполнения не существует, что означает, что невозможно скомпилировать T[], потому что компилятор не может генерировать код, который создает определенный, известный тип массива.

Что вы можете с этим поделать?Обычно вы используете класс Collection, например ArrayList, но я предполагаю, что ваше назначение не позволяет этого.

Один из способов принудительного применения обобщений во время выполнения - сохранить объект Class в каждом экземпляре MyStack.

public class MyStack<T> {

    int index;
    private Object[] data;
    private final Class<T> elementType;

    public MyStack(Class<T> elementType) {
        this.elementType = elementType;
        index = 0;
        data = new Object[5];
    }

Затем можно использовать метод cast для обеспечения безопасности типов в методе pop:

public T pop() {
    return elementType.cast(data[--index]);
}
0 голосов
/ 19 апреля 2019

Я думаю, что нет способа избежать предупреждения. В этом ask мы видим решение, использующее Array.newInstance (класс, размер). Но мы должны добавить аннотацию '@SuppressWarnings ("unchecked") ", чтобы справиться с этим.

Кроме того, если вы не занимаетесь программированием или не делаете фреймворк / библиотеку. Я рекомендую вам использовать структуры данных java.collection.

Надеюсь, я тебе помог

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...