Java,泛型和继承

马可

我对通用性,继承和接口有一个基本问题。

给出以下代码:

import java.util.ArrayList;
import java.util.List;

public class Generics {

    private Class1 obj1 = new Class1();

    public Generics() {
        Class1 obj1 = new Class1();
        Class2 obj2 = new Class2();
        Class2 obj3 = new Class2();
        Class2 obj4 = new Class2();

        List<Class2> obj1Children = new ArrayList<Class2>();

        obj1Children.add(obj2);
        obj1Children.add(obj3);
        obj1Children.add(obj4);
    }

    public static void main(String[] args) {
        Generics g = new Generics();
    }


    private class Class1 implements I1 {

        private List<I2> children;

        @Override
        public List<I2> getChildren() {
            return children;
        }

        @Override
        public void setChildre(List<I2> children) {
            this.children = children;
        }
    }

    private class Class2 implements I2 {
    }

    private interface I1 {
        List<I2> getChildren();
        void setChildre(List<I2> children);
    }

    private interface I2 {
    }
}

在Class1中,如果您更改以下行:

    private List<I2> children;

    private List<Class2> children;

然后我有一个编译错误,告诉我它不能将List强制转换为List。

我很困惑,因为我认为接口的全部目的是摆脱事物的实现方面。

有人可以解释吗?

巨人

I1明确定义了一种返回的类型的方法List<I2>您不能在实现类中出于任何原因将其更改为return List<Class2>这就是界面的重点。您的执行合同会在任何情况下I1迫使您退还某种形式的List<I2>款项。

除了接口实现对您施加的限制之外,您还应该知道“泛型”不是宽容的;它应该是“宽容的”。I2List<I2>不能转换为别的。甚至没有相同层次结构中的类。在这方面,java提供的类型安全性非常严格

考虑一下:

  1. Class2I2
  2. List<Class2>定义一个类型安全集合Class2小号
  3. List<I2> 定义的类型安全集合 I2s
  4. Java不会在任何时候允许List<Class2>替换List<I2>不在变量声明,方法参数或方法返回值中

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章