Можно ли в Java использовать переменную типа в качестве элемента массива внутри интерфейса? - PullRequest
1 голос
/ 19 января 2011

Можно ли в Java использовать переменную типа в качестве элемента массива внутри интерфейса?

Я пробовал как тип файла и как оператор приведения, но всегда получаю ошибку

Невозможно сделать статическую ссылку на нестатический тип A

interface ITest<A> {
    A[] j; // Cannot make a static reference to the non-static type A
    Object[] = (A[]) new Object[3]; // Cannot make a static reference to the non-static type A
}

Есть ли случай, когда я могу использовать конструкцию A[] внутри интерфейса (и в типе enum?)?

class CTest<A> {
    enum MyEnum {
        F, G, H;
        // something that uses A[] inside. Getting the same error as above
    }
}

Ответы [ 2 ]

4 голосов
/ 19 января 2011

Вы можете использовать универсальный тип массива в интерфейсе, например так:

public interface Foo<T> {
    void doSomething(T[] array);
}

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

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

1 голос
/ 19 января 2011

Поля в интерфейсах неявно являются открытыми, статическими и конечными , в основном они являются константами. И у вас не может быть констант, которые зависят от параметра типа, потому что в Java параметры компилируются из типа при компиляции.

Кстати, это не зависит от того, используете ли вы массив или нет,

public interface X<T> {
    T c = (T)new AnyType();
}

тоже не сработает. И не будет

public class X<T> {
  public static final T c = (T)new AnyType();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...