Java泛型:声明泛型类型的Map值

6

我是新手,对泛型还不熟悉。

有一个类似于 Map 的东西

private static Map<String, Object> map;

并且像这样的一种方法

public <T> T getObject(final Class<T> myClass) {
    return (T)map.get(myClass);
}

如何更改地图声明,以便在从方法返回时不必进行转换?

你有没有可能声明像 Map<String, Class<T>> 这样的映射表? - nobeh
@nobeh IDE显示:无法将T解析为类型。 - Display Name
我认为@Pablo对此有一个不错的答案。 - nobeh
为什么你为一个静态字段拥有一个非静态成员函数? - UmNyobe
3个回答

9
您需要创建一个通用类,而不是通用方法:
public class MyClass<T> {
   private Map<String, T> map;

   public T getObject(final String key) {
    return map.get(key);
   }
}

此外,我将参数从Class更改为String。如果map.get()期望一个String,传递Class就没有意义。

编辑:我没有注意到map是静态的。如果可以将其更改为非静态而不会破坏程序的其他部分,则可以使用此方法。如果不能,则无法避免转换。


无法对非静态类型 T 进行静态引用。 - Display Name
@DisplayName 好的,map 是静态的,我漏掉了这一点。如果你不能将 map 从静态变为非静态,那么这个方法就行不通了。 - Pablo

0

由于get()方法返回Object类型,您无法避免强制转换,请参见这里获取更多信息。


1
除非你可以以Map<String,T>的类型声明Map,但这似乎不适合你的示例。 - Miquel
@Miquel 即使这样也不会改变问题,get() 方法返回一个对象,而不是 T 类的实例。 - Grimmy
@Miquel 我试过了,但是不起作用。你能告诉我为什么吗? - Display Name
哦,看那边的@Pablo,那就是这样。 - Miquel
1
@Grimmy Map.get() 返回一个类型为 V 的对象,即其值的通用类型(毫不意外)- javadocs。你可能会想到的是,get 方法的参数总是一个 Object 而不是 K - Andrzej Doyle
显示剩余2条评论

0
如果你愿意去掉地图的static修饰符,那么你可以这样做:
public class MyClass<T> {

    private Map<String, T> map;

    public T getObject(final Class<T> myClass) {
        return map.get(myClass);
    }
}

否则:

在泛型类C的任何地方引用类型参数都会导致编译时错误,包括:

  • C的静态成员声明

这是从JLS中摘录的内容,它防止您使用参数化类来实现上述功能。

然而,试图做的是从另一个成员(也是静态成员)引用参数化方法的类型参数,这也是无法访问的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接