面试题答案
一键面试-
in
关键字的作用及对类型兼容性的影响:- 作用:
in
关键字用于声明类型参数为逆变(contravariant)。在Handler<in T>
中,T
是逆变类型参数。这意味着Handler
接口的使用者只能在其方法参数中使用T
类型(如fun handle(t: T)
),而不能在返回值或其他输出位置使用T
。 - 对类型兼容性的影响:对于逆变类型参数,类型兼容性与通常的子类型关系相反。如果
A
是B
的子类型,那么Handler<B>
是Handler<A>
的子类型。例如,如果Puppy
是Dog
的子类型,那么Handler<Dog>
是Handler<Puppy>
的子类型。这与协变(out
)的情况相反,协变时类型兼容性与子类型关系一致。
- 作用:
-
传入
DogHandler
的实例是否合法及原因:- 合法:因为
Handler<in T>
中的T
是逆变类型参数。Puppy
是Dog
的子类型,根据逆变规则,Handler<Dog>
是Handler<Puppy>
的子类型。DogHandler
实现了Handler<Dog>
,所以DogHandler
的实例可以作为Handler<Puppy>
类型的参数传入process
函数。在process
函数中,Handler<in Puppy>
要求可以处理Puppy
对象,由于DogHandler
能处理Dog
对象,而Puppy
是Dog
的子类型,所以DogHandler
也能处理Puppy
对象,符合函数参数类型要求。
- 合法:因为