翻译说明:安全
原标题: Parameters and Arguments: An Easy Way to Remember the Differenceapp
原文地址: typealias.com/guides/para…ide
原文做者: Dave Leeds函数
最近在深刻研究Kotlin中的泛型语法,发现它和Java中的泛型有着很大不一样,在语法上Kotlin的泛型也会比Java中的使用起来更安全。可是发现Kotlin泛型一时间冒出了不少的名词术语,什么协变、逆变、不变、星投影啊;什么实化参数、类型形参、类型实参啊,什么类、类型、子类、子类型、超类型弄得是一脸懵逼. 不过还好基本都弄懂了,因而乎想准备一系列关于Kotlin中泛型的博客来记录个人坎坷,但愿能有所帮助。post
如下是我以前的一些关于Kotlin的文章,如感兴趣欢迎查看:ui
翻译系列:spa
原创系列:插件
实战系列:翻译
今天是一篇简单的博客翻译做为Kotlin泛型语法系列开场白:3d
你是否曾经很难记住形参和实参的区别,今天这篇文章就是为了量身打造的。理清它们之间的区别能够帮助你更好地深刻理解函数,此外甚至能够更多帮助你理解泛型。
回忆二者之间的差别的最简单的简单的方法就是将arugment单词与outside单词关联起来,记住这句话
“Take your argument outside!”
这里有我画的一张卡通图帮你去记住它:
有关更多说明,让咱们看一下函数和泛型类的示例。
这是一个对整数进行平方的简单函数。将传递哪些数据?只是咱们想要平方的数字。
fun square(number: Int): Int {
return number * number
}
复制代码
在这个函数的定义里面,咱们说number就是一个形式参数。
如今已经定义好了咱们的函数,当咱们调用它时,会将一些数据传递给这个函数。
val radius = 5
val area = Math.PI * square(radius)
复制代码
这里,在函数定义的外面,咱们说radius是square函数的实际参数。
泛型类是具备一种或多种类型的类。例如,这里有个很是简单的Box
类,它只包含其余一些对象。
class Box<T>(var item: T)
复制代码
这里,在Box类定义的里面,咱们说T
是一个类型形参。
使用这个类十分简单,咱们只须要调用它的构造器,并传入一些符合正确类型的数据进去便可。
val box = Box<String>("Hello")
复制代码
这里,在Box类定义的外面,咱们使用String
类型实参去构造它。
事实上,Kotlin作了一些智能的类型推导,因此咱们甚至没必要明确指定它:
val box = Box("Hello")
复制代码
在这种状况下,它仍然有一个String
类型的类型实参。它只是隐含在咱们传递给构造函数的“Hello”实际参数的类型中而已。
再次说明下,在函数和泛型类/接口两种状况下,结论是:
其实这篇文章目的很简单就是帮助理解一个问题:Kotlin中泛型形参和实参区别。由于这两个术语将会在后续泛型文章中被屡次提到。因此若是不提早弄懂这些名词概念,后面一些深刻的东西理解起来会很是吃力的。我补充几点:
class StringList: List<String>{
...
}
复制代码
对于以上例子很好理解,StringList类实现List接口,提供了具体的类型实参: String,能够看到String明显是在List接口定义的外面,因此它就是类型实参
class ArrayList<T>: List<T>{
...
}
复制代码
关于这个例子,你们看看怎么分析呢?? 实际上很简单就按照这篇文章做者说的那样抓住问题关键点: 类型参数在类或接口定义外面仍是里面,里面就是形参,外面就是实参
因此,这里例子很容易分析出这个T是List接口的类型实参,而不同的是这个T同时仍是ArrayList这个类的类型形参。ArrayList类中定义了本身的类型形参T,并把指定为父类(List接口)类型的实参。在Kotlin的泛型中有这样规定: 若是一个类继承泛型类(或者实现了泛型接口),就必须为基础类型的泛型形参指定一个泛型实参。它能够是具体的类型或者另外一个类型形参。因此你会发现ArrayList 中的T和List中的T实际上有所不同的,就是类型形参和类型实参的区别。
这是泛型系列文章简单的开场白,下面将会继续深刻Kotlin泛型相关内容,例如泛型擦除以及实化类型参数,泛型协变,逆变,星投影。欢迎继续关注~~
欢迎关注Kotlin开发者联盟,这里有最新Kotlin技术文章,每周会不按期翻译一篇Kotlin国外技术文章。若是你也喜欢Kotlin,欢迎加入咱们~~~