相关疑难解决方法(0)

Java映射的值受键的类型参数限制

在Java中是否有一种方法可以使用映射,其中值的类型参数与键的类型参数相关联?我想写的内容如下:

public class Foo {
    // This declaration won't compile - what should it be?
    private static Map<Class<T>, T> defaultValues;

    // These two methods are just fine
    public static <T> void setDefaultValue(Class<T> clazz, T value) {
        defaultValues.put(clazz, value);
    }

    public static <T> T getDefaultValue(Class<T> clazz) {
        return defaultValues.get(clazz);
    }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,只要值的类型与Class对象的类型匹配,我就可以对Class对象存储任何默认值.我不明白为什么不允许这样做,因为我可以确保在设置/获取类型正确的值时.

编辑:感谢cletus的回答.我实际上并不需要地图本身的类型参数,因为我可以确保获取/设置值的方法的一致性,即使它意味着使用一些稍微丑陋的演员表.

java generics

36
推荐指数
2
解决办法
3万
查看次数

异构容器,用于在Java中存储通用类型的对象

我试图从Effective Java跟随Joshua Bloch的类型安全异构容器模式来创建一个对象容器(MyGeneric<T>)Class<T>作为键.

  public class MyClass {

    private Map<Class<?>, MyGeneric<?>> myContainer =
      new HashMap<Class<?>, MyGeneric<?>>();

    public <T> void addToContainer(Class<T> class, MyGeneric<T> thing) {
      myContainer.put(class, thing);
    }

    public <T> MyGeneric<T> getFromContainer(Class<T> class) {
      return (MyGeneric<T>)(myContainer.get(klass));
    }
  }
Run Code Online (Sandbox Code Playgroud)

问题在于getFromContainer我必须执行未经检查的强制转换.在Josh Bloch的容器中,他表演了一个安全演员 - 但就我而言,我看不出这是怎么回事.

有没有人有任何想法?

干杯,尼克.

java generics

13
推荐指数
1
解决办法
4471
查看次数

Typesafe forName类加载

Class.forName()结果是通用类型时如何调用?通常我都可以使用asSubclass(),但是在这里,我看到的唯一方法就是演员阵容,当其他所有东西都很好地输入泛型时,它会突然出现并让我烦恼.

场景如下:

有一个带有一个入口点主类的.jar main().它需要一个类名的选项(以及其他一些,在这里无关紧要).给出了类的实现Callable<Integer>.此类已加载,初始化和启动.

这是我需要的一个例子:

Class<? extends Callable<Integer>> clazz = (Class<? extends Callable<Integer>>) Class.forName(options.valueOf(className)).asSubclass(Callable.class);
Run Code Online (Sandbox Code Playgroud)

有没有办法摆脱那个演员?

使用SE6.

java generics

8
推荐指数
1
解决办法
3460
查看次数

标签 统计

generics ×3

java ×3