Что если основной метод сделан параметризованным, то как можно указать его реальный тип?
public class TestA {
@SuppressWarnings("unchecked")
public static <T> void main(String...args) throws InterruptedException {
Thread.currentThread().setName("--Parent--");
final InheritableThreadLocal<T> itl = new InheritableThreadLocal<T>() {
@Override
protected T childValue(T i)
{
System.out.println(Thread.currentThread().getName() + "\r\n" + i );
return i;
}
};
itl.set((T) new Integer(33));
Runnable r = new Runnable() {
@Override
public void run() {
Thread.currentThread().setName("--local--");
System.out.println(Thread.currentThread().getName() + "\r\n" + itl.get());
}
};
new Thread(r).start();
System.out.println(itl.get());
}
}
Так как я могу указать тип здесь. Поскольку в вышеприведенном коде тип не указан, тип объекта по умолчанию показан на рисунке. Я хочу сделать локальный внутренний класс "InheritableThreadLocal" универсальным.
1 ответ
Так как я могу указать тип здесь.
Ты не можешь
Или, по крайней мере... вы не можете указать тип, если main
Метод используется в качестве метода точки входа приложения при запуске JVM.
Тем не менее, это не имеет значения:
Поскольку дженерики реализованы с использованием стирания типов,
main
код метода не может сказать, что реальный типT
в любом случае.Так как метод не может сказать, не имеет значения, что это такое.
Обратите внимание, что в вашем примере единственное место, где T
"используется" в типе приведение (T)
, Если вы удалите @SuppressWarning
аннотации, компилятор скажет вам, что приведение типа является непроверенным преобразованием; то есть это ничего не делает.
Вы обнаружите, что это то же самое, что и для любого другого (компилируемого) примера универсального main
что ты можешь написать. В принципе, нет никакого способа написать общий main
где параметры типа действительно имеют значение.
Заметки:
JLS не утверждает, что
main
метод точки входа не может иметь параметров типа; см. JLS 12.1.4.Тривиальное Java-приложение с параметризованным
main
компилируется без ошибок и работает без ошибок.