0

我的 IDE 说这里的最后一行代码有问题 ( Cannot convert from Class<Ix> to Ix)。如何解决?

这里,Package是一个接口,该方法provides()返回Collection<Type>包提供的类型(接口)中的一个。

m将类型映射到提供该类型的包。

我想Manager's get()返回请求类型的东西。在下面的示例中,类P1是一个Package提供了一堆接口的类,包括Ix. 我希望能够要求Manager获取提供的包Ix并将其作为Ix.

public class Manager {

  public HashMap<Type, Package> m = new HashMap<Type, Package>();

  public void register(Package p) {
    for(Type t : p.provides())
      m.put(t, p);
  }

  @SuppressWarnings("unchecked")
  public <T> T get(T t) {
    return (T) m.get(t);
  }

  public static void main(String[] args) {
    Manager manager = new Manager();
    P1 p1 = new P1();
    manager.register(p1);
    Ix ix = manager.get(Ix.class);
    // What do I need to change so that the method call returns p1 as an Ix?
  }
}

我意识到这段代码中的想法似乎很愚蠢。但我仍然想了解这个问题以及如何解决它。提前致谢!

4

1 回答 1

2

1) 我需要更改什么以便方法调用将 p1 作为 Ix 返回?

好吧,坦率地说,你真的不能。您可以尝试强制转换,但我很确定这会引发各种错误。

就确保get()返回类型变量而言T,您需要将所需返回类型的一些实例传递给该方法。问题在于您将Class对象传递给get(T t),因此它返回类型为 的对象Class

的参数get()只需要是所需返回类型的实例
尝试:Ix ix = manager.get(new Ix());

这将解决您的编译器给您的错误;但我认为你正在以错误的方式接近你想做的事情。

编辑:我刚刚意识到你提到Ix的是一个接口——在这种情况下你需要传递一个实现的类Ixget()因为你不能实例化接口。


2) 我希望能够要求经理获取提供 Ix 的包裹并将其作为 Ix 退回。

我想你是在问超级界面Ix?如在什么Ix实现?您将无法将其存储在Ix变量中,至少不会没有错误。Ix可以Ix包含对象和任何子类Ix,但不能包含超类/超接口。

如果您只需要知道超级接口Ix是什么,我建议您使用instanceof.

于 2013-11-01T19:15:20.520 回答