【问题标题】:Java interface questionJava接口问题
【发布时间】:2010-12-21 23:06:08
【问题描述】:

假设我有 2 个接口,A 和 B:

public interface A {
 List<B> getBs();
}

public interface B {
}

以及实现这些接口的 2 个类:

public class AImpl implements A {

 public List<B> getBs() {
  return null;
 }

}


public class BImpl implements B {
}

我的 getter 方法是否有可能(可能使用泛型)返回一个 BImpl 类型对象的列表,例如:

public class AImpl implements A {

 public List<BImpl> getBs() {
  return null;
 }

}

谢谢

【问题讨论】:

    标签: java generics interface covariance


    【解决方案1】:

    我认为您需要将接口声明更改为:

    public interface A {
     List<? extends B> getBs();
    }
    

    但是,如果您希望客户知道您使用哪种实现类型,事情会变得更加复杂:

    public interface A<C extends B> {
         List<C> getBs();
    }
    
    public class AImpl implements A<Bimpl>{
         public List<Bimpl> getBs();
    }
    

    【讨论】:

    • 编译:public interface A.
    • @andy true,我使用了方法语法,而不是类型语法。已修复,谢谢
    【解决方案2】:

    仅当您可以将A.getBs()方法的定义更改为:

    List<? extends B> getBs();
    

    【讨论】:

      【解决方案3】:

      不,因为泛型类型不是协变的。

      List&lt;BImpl&gt; 不是List&lt;B&gt; 的子类。

      接口 A 中方法的部分约定是它返回一个List&lt;B&gt;

      public interface A {
       List<B> getBs();
      }
      

      List&lt;BImpl&gt; 不支持该合同。例如,期望 List&lt;B&gt; 的收件人可能会尝试将其他类型 B 的实例添加到列表中,例如 BImpl2BImpl3

      仅包含 BImpl 的 List&lt;B&gt; 将支持该合同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-19
        • 1970-01-01
        • 2010-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多