考虑以下两个Java文件,它们包含我的问题的简化版本
#a.java
package a;
public interface I {
//...
}
#b.java
package b;
public interface I {
//... (different stuff from a.I)
}您会注意到,在我的项目中有两个名为"I“的接口。这是不能更改的。我所处的情况是,我需要在单个类中使用这两种类型。当然,现在我可以将它们的每个类型都引用为a.I和b.I,但除了保持可读性之外,我尽量避免这样做。
我想做这样的事情
interface B extends b.I {
}这可以让我通过使用B和来使用I的接口,而通过导入来使用a.I作为I。问题是这不起作用,让我们以这个具体的例子为例,使用
interface MyList extends List<String> {
}
MyList l = new ArrayList<String>();这会产生类型错误。为什么Java不“知道”MyList扩展列表?
另外,我在上面的示例中尝试了强制转换,但它生成了一个ClassCastException
有什么想法?
发布于 2009-08-31 02:57:14
这是有效的:
List<String> list = new MyList();这不是:
MyList l = new ArrayList<String>();ArrayList不是MyList。它们只有一个通用的超级界面。这就是它不起作用的原因。Java“知道”MyList是一个List,但这并不意味着你可以给它分配一个List。
考虑一下:
public interface MyList extends List<String> {
void foo();
}
MyList l = new ArrayList<String>();
l.foo();显然,ArrayList没有foo()方法。
发布于 2009-08-31 02:56:58
Java知道MyList扩展了List<String>,但它也很清楚ArrayList<String>不实现MyList。我强烈建议用最简单、最清晰、最干净、最易读的方式来消除歧义:使用a.I和b.I!
发布于 2009-08-31 02:57:51
您不能将ArrayList<String>转换为MyList,因为MyList不是ArrayList<String>的超类或超接口。假设您实际上向MyList添加了一个方法,比如MyList.swizzle()。如果Java允许强制转换,然后调用l.swizzle(),会发生什么?
我不认为你会找到一个令人满意的解决方案,因为Java没有import as类型重命名语句。但是在Java1.5中,禁止实现一个接口来将其成员添加到类的名称空间中:如果您打算沿着这条路线走下去,请尝试一下static import。这是当今最受欢迎的成语,用来描述你正在尝试做的事情。
https://stackoverflow.com/questions/1355617
复制相似问题