温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

泛型Java类与泛型类型的协变与逆变

发布时间:2024-10-24 15:08:47 来源:亿速云 阅读:78 作者:小樊 栏目:编程语言

在Java中,泛型提供了类型安全的方式来创建可重用的类和方法。泛型支持协变和逆变,这有助于更好地理解和使用泛型类型。

协变(Covariance)

协变是指子类型可以替换其父类型的情况。在Java中,泛型类型支持协变,这意味着你可以将一个子类型的泛型参数替换为其父类型的泛型参数,而不会导致编译错误。

例如,假设你有一个泛型接口Shape

public interface Shape<T> {
    T getArea();
}

你可以创建一个继承自Shape接口的Circle类:

public class Circle<T> implements Shape<T> {
    private T area;

    @Override
    public T getArea() {
        return area;
    }

    // ... 其他代码
}

注意,Circle类也使用了泛型参数T。由于Java的泛型支持协变,你可以将Circle<Integer>类型的对象赋值给Shape<?>类型的变量:

Shape<?> shape = new Circle<>();

逆变(Contravariance)

逆变是指父类型可以替换其子类型的情况。在Java中,泛型类型也支持逆变,但需要注意的是,逆变仅适用于泛型参数的限定类型(通常是? extends T? super T)。

例如,假设你有一个泛型接口Drawable

public interface Drawable<T> {
    void draw(T object);
}

你可以创建一个继承自Drawable接口的Shape类:

public class Shape<T> implements Drawable<T> {
    @Override
    public void draw(T object) {
        // ... 绘制逻辑
    }

    // ... 其他代码
}

由于Java的泛型支持逆变,你可以将Drawable<Shape>类型的对象赋值给Drawable<? super Shape>类型的变量:

Drawable<?> drawable = new Shape<>();
drawable.draw(new Shape<>());

总结

  • 协变允许子类型的泛型参数替换其父类型的泛型参数。
  • 逆变允许父类型的泛型参数替换其子类型的泛型参数,但仅适用于限定类型(? extends T? super T)。
  • 使用泛型协变和逆变可以提高代码的可重用性和类型安全。
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI