我是 java 的新手,并没有太多使用接口(interface),这是我认为是一个非常基本的问题。
我定义了一个接口(interface),扩展它的第二个接口(interface),然后是一个实现第二个接口(interface)的类:
public interface I1 {
public void doStuff();
}
public interface I2 extends I1 {
public void doMoreStuff();
}
public class C2 implements I2 {
public void doStuff(){
// implements I1 as required
}
public void doMoreStuff(){
// implements I1 as required
}
}
然后我想调用一个方法,该方法将实现接口(interface) I1 的对象集合作为参数:
public class C3 {
public static void doI1Stuff(List<I1> implementorsOfI1){
// code here
}
}
但是当我尝试类似的操作时出现上述错误
C2 aC2 = new C2();
List c2L = new List<I2>();
c2L.add(aC2);
C3.doI1Stuff(c2L);
作为一个 Java 新手,我所做的似乎是合理的。为什么它不起作用,更有经验的程序员会怎么做?我希望我在某个地方犯了非常简单的错误,这实际上是可能的......
(修改后的问题:如果我正在处理单个 C2 对象而不是它们的集合,它会起作用(如答复所述)......)
最佳答案
更新
糟糕,您的 c2L 是 List
,不是 List`。这应该编译——它的作用和它对其他评论者的作用一样——尽管出于我在下面描述的相同原因它是危险的。我暂时把这个答案留在这里,但如果我觉得它没有用,我可以删除它
public static void doI1Stuff(List<I1> implementorsOfI1)
...
C3.doI1Stuff(c2L);
doI1Stuff
期望一个 List<I1>
但你传递给它一个 List<I2>
这是不允许的。听起来很奇怪,“一袋苹果不是一袋水果”。原因是您可以将任何水果放入一袋水果中,例如香蕉,但你不能用一袋苹果做到这一点。
将它与你的例子联系起来,考虑还有一个 class C1 extends I1
. doI1Stuff
可以加一个C3
参数,违约。意识到您的参数命名错误可能会澄清,它应该是 listOfImplementorsOfT1
.
解决问题的一种方法是将声明更改为
public static void doI1Stuff(List<? extends I1> implementorsOfI1)
这表示参数是一个某种未知类型的列表extends I1
. List<I2>
, List<C2>
, List<C1>
都满足满足约束。使用此声明,该方法无法向该列表添加任何内容,因为它不知道该类型是什么。
关于java 方法不适用于参数(接口(interface)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17982114/