gpt4 book ai didi

java 方法不适用于参数(接口(interface))

转载 作者:行者123 更新时间:2023-11-30 11:30:03 27 4
gpt4 key购买 nike

我是 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com