Что если основной метод сделан параметризованным, то как можно указать его реальный тип?

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 где параметры типа действительно имеют значение.


Заметки:

  1. JLS не утверждает, что main метод точки входа не может иметь параметров типа; см. JLS 12.1.4.

  2. Тривиальное Java-приложение с параметризованным main компилируется без ошибок и работает без ошибок.

Другие вопросы по тегам