【发布时间】:2020-10-18 13:04:17
【问题描述】:
在 Kotlin 中学习泛型时,我在一本书中读到以下内容:
一般来说,如果类具有使用它作为返回类型的函数,或者如果类具有该类型的 val 属性,则类或接口泛型类型可以使用 out 作为前缀。但是,如果类具有该泛型类型的函数参数或 var 属性,则不能使用 out。
我理解规则所说的内容,但我很乐意(通过示例)理解没有此规则的情况(即在声明泛型 Class/ 时使用 out 时没有约束接口),以及为什么返回类型可以来自类型 T 并且仍然类/接口可以包含 out T 并不“危险”。
无法理解类属性将表现为协变的问题的示例:
class Pet{....}
class Dog:Pet{...}
class PetSomething <T : Pet>
{
T t;
public fun petDoSomething(T t)
{
.... // what can be the problem here?
}
}
class DogSomething
{
dogDoSomething()
{
d : Dog = Dog()
petDoSomething(d)
//what is the problem here???
}
}
另外书中显示如下代码:
abstract class E<out T> (t:T) { val x = t }
并且代码正在编译,尽管泛型类型是构造函数的输入。这不违反规则吗?
【问题讨论】:
-
您能否重新表述您问题的第一部分?我不明白。 “没有这条规则可能会发生什么(即在声明泛型类/接口时使用 out 时没有约束)”
-
@Tenfour04,我在问题中添加了一个示例。也许它可以帮助您理解我在问什么。如果没有,我会尝试另一种方式,因为这对我来说有点困难。