相关疑难解决方法(0)

我为什么要关心Java没有具体化的泛型?

这是我最近在一次采访中提出的一个问题,即候选人希望看到添加到Java语言中的问题.它通常被认为是一种痛苦,Java没有具体化的仿制药,但是,当被推动时,候选人实际上无法告诉我他在那里可能取得的那些事情.

显然因为原始类型在Java中是允许的(以及不安全的检查),所以可以颠覆泛型并最终List<Integer>得到(例如)实际包含Strings.如果类型信息具体化,这显然是不可能的; 但必须有更多!

人们可以发布他们真正想要做的事情的例子,是否有可用的具体化的泛型?我的意思是,显然你可以List在运行时得到一个类型- 但是你会用它做什么?

public <T> void foo(List<T> l) {
   if (l.getGenericType() == Integer.class) {
       //yeah baby! err, what now?
Run Code Online (Sandbox Code Playgroud)

编辑:对此的快速更新,因为答案似乎主要是关注需要传入Class一个参数(例如EnumSet.noneOf(TimeUnit.class)).我正在寻找更多的东西,这是不可能的.例如:

List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();

if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
    l1.addAll(l2); //why on earth would I be doing this anyway?
Run Code Online (Sandbox Code Playgroud)

java generics reification

101
推荐指数
10
解决办法
1万
查看次数

泛型和Class.forName

我想使用其名称创建指定类的实例.我的代码如下所示.

我收到编译器警告.我这样做是对的吗?甚至可以使用类的名称并获取该类型的实例,因为我认为编译器不知道该类型应该是什么方式?

public static <T> T create(final String className) {
    try {
        final Class<?> clazz = Class.forName(className);

        //WARNING: Type safety: Unchecked cast from capture#2-of ? to T
        return (T) create(clazz); 
    }
    catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

public static <T> T create(final Class<T> classToCreate) {
    final Constructor<T> constructor;
    try {
        constructor = classToCreate.getDeclaredConstructor();
        final T result = constructor.newInstance();
        return result;
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢

java generics instantiation

22
推荐指数
1
解决办法
3万
查看次数

标签 统计

generics ×2

java ×2

instantiation ×1

reification ×1