Статический метод в универсальном классе? - PullRequest
185 голосов
/ 01 июня 2009

В Java я хотел бы иметь что-то вроде:

class Clazz<T> {
  static void doIt(T object) {
    // shake that booty
  }
}

Но я получаю

Cannot make a static reference to the non-static type T

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

Может ли кто-нибудь уточнить, возможно ли такое использование подобным образом? Кроме того, почему моя первоначальная попытка оказалась неудачной?

Ответы [ 12 ]

1 голос
/ 04 мая 2016

Кроме того, проще говоря, это происходит из-за свойства «Erasure» обобщения. Это означает, что хотя мы определяем ArrayList<Integer> и ArrayList<String>, во время компиляции он остается как два разных конкретных типа во время выполнения JVM стирает универсальные типы и создает только один класс ArrayList вместо двух классов. Поэтому, когда мы определяем метод статического типа или что-либо еще для универсального объекта, он используется всеми экземплярами этого универсального шаблона, в моем примере он является общим для ArrayList<Integer> и ArrayList<String>. Вот почему вы получаете ошибку. Параметр класса не допускается в статическом контексте!

0 голосов
/ 16 июля 2018

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

class Class<T> {
  static void doIt(T object) {
    // using T here 
  }
}

T доступно только после создания экземпляра. Но статические методы можно использовать даже до того, как станут доступны экземпляры. Таким образом, на параметры общего типа нельзя ссылаться внутри статических методов и переменных

...