То, что вы написали, не имеет никакого смысла, универсальные в Java предназначены для добавления функциональности параметрического полиморфизма к объектам.
Что это значит? Это означает, что вы хотите, чтобы некоторые переменные типа ваших классов не определились, чтобы иметь возможность использовать ваши классы со многими различными типами.
Но ваша переменная типа T
является атрибутом, который разрешается во время выполнения, компилятор Java скомпилирует ваш класс, проверяя безопасность типов, не пытаясь узнать, какой тип объекта T
, поэтому для него невозможно позволить использовать переменную типа в статическом методе. Тип связан с экземпляром объекта во время выполнения, тогда как public void static main(..)
связан с определением класса, и в этой области T
ничего не значит.
Если вы хотите использовать переменную типа внутри статического метода, вы должны объявить метод как универсальный (это потому, что, как объяснено переменные типа класса шаблона связаны с его экземпляр времени выполнения ), а не класс:
class SandBox
{
public static <T> void myMethod()
{
T foobar;
}
}
это работает, но, конечно, не с main
методом, поскольку нет способа вызвать его универсальным способом.
EDIT : Проблема в том, что из-за стирания типа 1036 * только один универсальный класс компилируется и передается в JVM. Проверка типов просто проверяет, является ли код безопасным, тогда, поскольку он доказал, что всякая общая информация отбрасывается.
Чтобы создать экземпляр T
, вам нужно знать тип T
, но это может быть много типов одновременно, поэтому одно решение с минимальным количеством отражений - это использование Class<T>
для создания нового экземпляра. объекты:
public class SandBox<T>
{
Class<T> reference;
SandBox(Class<T> classRef)
{
reference = classRef;
}
public T getNewInstance()
{
try
{
return reference.newInstance();
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
public static void main(String[] args)
{
SandBox<String> t = new SandBox<String>(String.class);
System.out.println(t.getNewInstance().getClass().getName());
}
}
Конечно, это означает, что тип, который вы хотите создать:
- не является примитивным типом
- имеет конструктор по умолчанию
Чтобы работать с разными видами конструкторов, вам нужно глубже погрузиться в отражение.