我的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?
}
}
我意识到这段代码中的想法似乎很愚蠢。但我仍然想了解这个问题以及如何解决它。提前谢谢!
答案 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
。