相关疑难解决方法(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中通用接口的集合

我正在尝试为正在构建的Android应用程序创建轻量,线程安全的应用程序内发布/订阅机制。我的基本方法是跟踪IEventSubscriber<T>每个事件类型T 的列表,然后能够通过传递类型T的有效负载来将事件发布到订阅对象。

我使用通用方法参数来(确保)确保以类型安全的方式创建订阅。因此,我非常确定,当我要从发布地图中获取订阅者列表时,是时候发布一个可以将其强制转换为的列表的事件了IEventSubscriber<T>,但是,这会生成未经检查的强制转换警告。

我的问题:

  1. 未经检查的演员在这里真的安全吗?
  2. 我如何才能实际查看订户列表中的项目是否实现IEventSubscriber<T>
  3. 假设(2)涉及一些令人讨厌的反思,您在这里会做什么?

代码(Java 1.6):

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CopyOnWriteArraySet;

public class EventManager {
  private ConcurrentMap<Class, CopyOnWriteArraySet<IEventSubscriber>> subscriptions = 
      new ConcurrentHashMap<Class, CopyOnWriteArraySet<IEventSubscriber>>();

  public <T> boolean subscribe(IEventSubscriber<T> subscriber,
      Class<T> eventClass) {
    CopyOnWriteArraySet<IEventSubscriber> existingSubscribers = subscriptions.
        putIfAbsent(eventClass, new CopyOnWriteArraySet<IEventSubscriber>());
    return existingSubscribers.add(subscriber);
  }

  public <T> boolean removeSubscription(IEventSubscriber<T> subscriber, 
      Class<T> eventClass) {
    CopyOnWriteArraySet<IEventSubscriber> existingSubscribers = 
        subscriptions.get(eventClass);
    return existingSubscribers == null || !existingSubscribers.remove(subscriber);
  }

  public <T> void publish(T message, Class<T> eventClass) {
    @SuppressWarnings("unchecked")
    CopyOnWriteArraySet<IEventSubscriber<T>> …
Run Code Online (Sandbox Code Playgroud)

java generics

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

标签 统计

generics ×2

java ×2