【发布时间】:2017-07-12 23:57:31
【问题描述】:
我的代码如下所示。我在摄取方法中使用 Handler 原始类型时遇到了一些未经检查的警告。我被困在删除警告和我使用原始类型的最佳方法上。我的主要绊脚石是摄取方法参数是 IV2GraphObject 并且任何尝试在处理程序上设置边界都会在尝试调用处理程序上的句柄方法时产生编译错误。
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);
}
}
}
【问题讨论】:
-
为什么有
getInstance而不是构造函数?似乎不是单例。为什么要通过(而不是使用)VisalloEnv environment?graphFactory是什么?您添加到handlers的所有这些类是什么?你得到的实际错误是什么? -
我认为没有任何方法可以完全避免使用给定结构的警告。这只是你想要哪个警告以及在哪里的问题。
-
为什么
@SuppressWarnings("rawtypes")不起作用?虽然我什至看不到这段代码是如何编译的 -
您的
ingest方法可以接受IV2GraphObject的任何子类型。然后您尝试将其传递给处理程序,该处理程序只接受IV2GraphObject的某个子类型。应该重新考虑你的设计,这没有意义。 -
我想我已经回答了我自己的问题。我不想改变摄取方法的行为。我希望它按照我定义的方式工作以采用任何类型的 IV2GraphObject,因为这实际上只是我控制的内部结构。我只需要在 Handler 接口中调整我的句柄方法定义。我将其定义如下,并且能够删除我添加的 SuppressWarning 注释。我敢肯定,它可能会更好,但它满足我的直接需求。
void handle(T iv2Object);