泛型类对象的嵌套泛型参数没有意义

时间:2014-08-21 14:10:13

标签: java generics

类型Class<T>有一个通用参数,即对象所代表的类的类型,这非常有意义。

但是,在处理具有泛型参数的类型的类对象时,例如List<T>,我们可以通过两种可能的方式解决这个问题:

  1. 我们将其称为Class<List<MyType>>,这是没有意义的:List的泛型参数失去了意义,因为我们只是引用它的(静态)类。即使Class<List<?>>在概念上看起来也是错误的。
  2. 我们只省略内部参数并将其称为Class<List>。但在这种情况下,编译器将生成警告,因为它将List检测为非参数化。
  3. 首先我想,编译器不够智能,无法正确处理这种情况,但我猜原始的原因具有概念性。

    这个问题有一个干净的解决方案吗?如果没有,您认为最好的处理方式是什么?插入@SuppressWarnings("rawtypes")或使用Class<List<?>>

    更新

    我在某些代码上遇到此问题,用户应该能够为数据库连接提供自定义类。此类应扩展DoodleDatabaseMap<T>,这是一个抽象类并实现Map<String, T>

    我认为上面的描述不够准确。当我需要保存传递​​类对象或将它们分配给变量时,它会变得毛茸茸。我的API方法如下所示:

    public static void setDatabaseMap(Class<? extends DoodleDatabaseMap> databaseMap) {
        // ...
    }
    

    在此处为DoodleDatabaseMap提供泛型类型会在调用它时导致编译错误(FileDatabaseMap extends DoodleDatabaseMap):

    DoodleDebug.setDatabaseMap(FileDatabaseMap.class);
    

    这会导致出现错误消息:The method setDatabaseMap(Class<? extends DoodleDatabaseMap<?>>) in the type DoodleDebug is not applicable for the arguments (Class<FileDatabaseMap>)

1 个答案:

答案 0 :(得分:2)

  

这个类应该扩展DoodleDatabaseMap,它是一个抽象类并实现Map

然后你可以改变这个

static void setDatabaseMap(@SuppressWarnings("rawtypes") 
    Class<DoodleDatabaseMap> databaseMap)

使用{/ 3}类型

static void setDatabaseMap(Class<DoodleDatabaseMap<?>> databaseMap)