0
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”通用。

4

1 回答 1

1

那么如何在这里指定类型。

你不能。

或者至少......如果main在启动 JVM 时将该方法用作应用程序入口点方法,则您不能指定类型。

但是,这并不重要:

  • 由于泛型是使用类型擦除实现的,因此main方法代码无论如何也无法分辨出真正的类型T是什么。

  • 既然方法说不出来,那是什么也无所谓。


请注意,在您的示例中,“使用”的唯一地方T是类型 cast (T)。如果您删除@SuppressWarning注释,编译器会告诉您类型转换是未经检查的转换;即它没有做任何事情。

您会发现这与main您可以编写的任何其他(可编译)泛型示例相同。基本上,没有办法main在类型参数实际上很重要的地方编写泛型。


笔记:

  1. JLS 没有声明main入口点方法不能有类型参数;见JLS 12.1.4

  2. 带有参数化的普通 Java 应用程序main编译时不会出错,并且运行时不会出错。

于 2015-08-13T13:41:31.493 回答