Вопрос-ответ

Static method in a generic class?

Статический метод в универсальном классе?

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

class Clazz<T> {
static void doIt(T object) {
// ...
}
}

Но я получаю

Не удается создать статическую ссылку на нестатический тип T

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

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

Переведено автоматически
Ответ 1

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

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

Ответ 2

Java не знает, что такое T, пока вы не создадите экземпляр типа.

Возможно, вы можете выполнять статические методы путем вызова Clazz<T>.doit(something) но похоже, что вы не можете.

Другой способ справиться с этим - поместить параметр типа в сам метод:

static <U> void doIt(U object)

который не дает вам правильного ограничения для U, но это лучше, чем ничего....

Ответ 3

Я столкнулся с такой же проблемой. Я нашел свой ответ, загрузив исходный код для Collections.sort в java Framework. Ответ, который я использовал, заключался в том, чтобы поместить <T> generic в метод, а не в определение класса.

Итак, это сработало:

public class QuickSortArray  {
public static <T extends Comparable> void quickSort(T[] array, int bottom, int top){
//do it
}

}

Конечно, прочитав ответы выше, я понял, что это было бы приемлемой альтернативой без использования универсального класса:

public static void quickSort(Comparable[] array, int bottom, int top){
//do it
}
Ответ 4

Я думаю, что этот синтаксис еще не упоминался (на случай, если вам нужен метод без аргументов):

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

И вызов:

String str = Clazz.<String>doIt();
java generics