将某物作为特定类型归还

时间:2013-11-01 18:43:53

标签: java generics

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

此处,Package是方法provides()返回包提供的Collection<Type>类型(接口)的接口。

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

我希望Manager's get()返回所请求类型的内容。在下面的示例中,类P1Package,它提供了一堆接口,包括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?
  }
}

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

1 个答案:

答案 0 :(得分:2)

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

好吧,直言不讳你真的不能。你可以尝试投射,但我很确定会抛出各种错误。

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

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

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

编辑:我刚刚意识到您提到Ix是一个接口 - 在这种情况下,您需要将实现Ix的类传递给get() ,因为你无法实例化接口。


2)我希望能够让经理获得提供Ix的包并将其作为Ix返回。

我认为你要求Ix超级接口?和Ix实现的一样?您将无法将其存储在Ix变量中,至少不会没有错误。 Ix可以保存Ix个对象和Ix的任何子类,但不能保存超类/超接口。

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