假设我们有类X和通用类Y

class X {}

class Y<T extends X> {}


为什么以下声明合法?

Y<? extends Serializable> obj; //I understand this as any type extends X and Serializable


我了解的是?表示满足<T extends X>的任何类型,包括X本身。因此,实现XSerializable子类适合此处。但是,X本身不实现Serializable,那么为什么前面的声明起作用?

最佳答案

我了解的是?表示满足<T extends X>的任何类型,包括X本身。


是的,并且您为变量obj添加了附加限制,该变量?代表的未知类型必须实现Serializable


因此,实现XSerializable子类适合此处。


那就对了。


但是,X本身不实现Serializable,那么为什么前面的声明起作用?


X不实现Serializable没关系-为什么这很重要?

extends Serializable只是添加到类型的附加限制,尤其是对于变量obj

请注意,您只能为变量obj分配一个值,该值是扩展了X并且还实现Serializable的类的实例。

// Error! X does not implement Serializable, so this is not allowed
Y<? extends Serializable> obj = new Y<X>();

class Z extends X implements Serializable { ... }

// No problem, since Z extends X and also implements Serializable
Y<? extends Serializable> obj = new Y<Z>();

关于java - Java泛型-具有接口(interface)绑定(bind)问题的通配符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58623320/

10-11 05:05