修复对原始类型警告Java的未检查调用

修复对原始类型警告Java的未检查调用,java,generics,Java,Generics,我有下面显示的代码。我在ingest方法中使用处理程序原始类型时遇到了几个未经检查的警告。我一直在寻找消除警告和使用原始类型的最佳方法。我的主要障碍是ingest方法参数是IV2GraphObject,当试图在处理程序上调用handle方法时,任何对处理程序设置边界的尝试都会导致编译错误 public class IV2Ingestor implements Ingestor<IV2GraphObject> { public interface Handler<T exte

我有下面显示的代码。我在ingest方法中使用处理程序原始类型时遇到了几个未经检查的警告。我一直在寻找消除警告和使用原始类型的最佳方法。我的主要障碍是ingest方法参数是IV2GraphObject,当试图在处理程序上调用handle方法时,任何对处理程序设置边界的尝试都会导致编译错误

public class IV2Ingestor implements Ingestor<IV2GraphObject> {
  public interface Handler<T extends IV2GraphObject> {
    void handle(T iv2Object);

    Set<? extends Element> getNewElements();
  }

  // map of handlers for supported objects
  private Map<Class<? extends IV2GraphObject>, Handler<? extends IV2GraphObject>> handlers;

  public static IV2Ingestor getInstance(VisalloEnv environment) {
    // create a new instance
    IV2Ingestor ingestor = new IV2Ingestor();

    ingestor.handlers = new HashMap<>();
    ingestor.handlers.put(Tweet.class, new TweetHandler(graphFactory));
    ingestor.handlers.put(TwitterUser.class, new TwitterUserHandler(graphFactory));
    ingestor.handlers.put(GoogleNews.class, new GoogleNewsHandler(graphFactory));
    ingestor.handlers.put(VKPost.class, new VKPostHandler(graphFactory));
    ingestor.handlers.put(YouTube.class, new YouTubeHandler(graphFactory));
    ingestor.handlers.put(Instagram.class, new InstagramHandler(graphFactory));

    // return ingestor
    return ingestor;
  }

  @Override
  public void ingest(IV2GraphObject ingestable) {
    Class<? extends IV2GraphObject> ingestableClass = ingestable.getClass();

    if (handlers.containsKey(ingestableClass)) {
        Handler handler = handlers.get(ingestableClass);

        try {
            handler.handle(ingestable);
        } finally {
            // persist changes
            graph.flush();

            // notify GPWs of any new graph elements
            workQueueRepository.pushElements(handler.getNewElements(), Priority.LOW);
        }
    }
  }
公共类IV2Ingestor实现摄入器{
公共接口处理程序{
无效句柄(T IV2对象);

设置首先,您有一个从类到处理程序的映射,您希望每个
都映射到一个
处理程序
,但是您不能用映射的类型来表达这种关系。为了安全地实现这一点,您应该创建一个新的类,它的API在参数类型中强制这种关系,并返回
get
的值e> put
(类内部仍有未检查的强制转换,但类的API保证这是安全的):

但是,即使我们这样做,编译器仍然不知道
ingestable
是同一类型
T
的实例(我们知道它一定是,但编译器只知道
ingestable
IV2GraphObject
的实例)。我们可以使用类的
.cast()
在没有任何警告的情况下将其强制转换为类型
T
(我们知道强制转换总是成功的,但我们这样做只是为了在没有警告的情况下编译;我们也可以直接执行
(T)
强制转换,这将产生警告):

public void摄取(IV2GraphObject可摄取){

类为什么要使用
getInstance
而不是构造函数?似乎不是单例。为什么要通过(而不是使用)
visallowenv环境
?什么是
graphFactory
?您添加到
处理程序
的所有这些类都是什么?您得到的实际错误是什么?我不认为有任何方法可以完全用给定的结构避免警告。问题只是您想要哪种警告以及在哪里。为什么
@w阿宁斯(“原始类型”)
不起作用?虽然我甚至看不出这段代码是如何编译的,但是你的
摄取
方法可以接受
IV2GraphObject
的任何子类型。然后你尝试将它传递给处理程序,它只接受
IV2GraphObject
的特定子类型。如果重新考虑你的设计,这是没有意义的。我想我回答了我自己的要求ion。我不想更改ingest方法的行为。我想让它按照我定义的方式工作,以接受任何类型的IV2GraphObject,因为这实际上只是我控制的内部结构。我只需要在处理程序接口中调整我的handle方法定义。我像下面一样定义它,并能够删除Suppress我加了一个旋转。我肯定它会更好,但它满足了我的迫切需要;
class ClassToHandler {
    private Map<Class<? extends IV2GraphObject>, Handler<? extends IV2GraphObject>> map
        = HashMap<>();

    @SuppressWarnings("unchecked")
    public <T extends IV2GraphObject> Handler<T> get(Class<T> clazz) {
        return (Handler<T>)map.get(clazz);
    }

    public <T extends IV2GraphObject> void put(Class<T> clazz, Handler<T> handler) {
        map.put(clazz, handler);
    }
}
helper(ingestableClass, ...);

private <T extends IV2GraphObject> void helper(Class<T> clazz, ...) { ... }
public void ingest(IV2GraphObject ingestable) {
    Class<? extends IV2GraphObject> ingestableClass = ingestable.getClass();
    helper(ingestableClass, ingestable);
}

private <T extends IV2GraphObject> void helper(Class<T> clazz, IV2GraphObject ingestableTemp) {
    T ingestable = clazz.cast(ingestableTemp);
    Handler<T> handler = handlers.get(ingestableClass);
    try {
        handler.handle(ingestable);
    // ...
}