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

标签 java

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

相关文章:

java - 使用 Java 实现多轨音频

java - 如何抑制特定目录或文件(例如生成的代码)的 Java 警告

java - android多次写入文本文件

java - NoClassDefFoundError : groovy/lang/binding

java - 如何修复 "javax.net.ssl.SSLHandshakeException: TLS Server certificate issued after 2019-04-16 and anchored by a distrusted legacy Symantec root CA"

java - String 类的 Gson 自定义反序列化器

java - 在 NativeScript 中使用 Android 原生代码 (JAVA)

java - java中动态读取xml元素和值

java - Google Appengine JAVA - Zip 大量保存在 Blobstore 中的图片

java - 将文件上传到 Blob 存储时,Google App Engine 和自定义域出现 CORS 问题