第十五節 泛型
1、
fun main(args: Array<String>) {
//使用箱子
val box=Box<String>("張三")
println(box.thing)
val box2=Box<Int>(10)
println(box2.thing)
}
//箱子
open class Box<T>(var thing:T)
2、
fun main(args: Array<String>) {
var fruitBox:FruitBox=FruitBox(Apple())
fruitBox.thing.sayHello()
var fruitBox1:FruitBox=FruitBox(Orange())
fruitBox1.thing.sayHello()
}
//箱子
open class Box<T>(var thing:T)
//定義一個水果箱子
class FruitBox(value:Fruit):Box<Fruit>(value)
abstract class Fruit
{
abstract fun sayHello()
}
class Apple:Fruit() {
override fun sayHello() {
println("蘋果")
}
}
class Orange:Fruit() {
override fun sayHello() {
println("橘子")
}
}
輸出:
3、泛型函式
fun main(args: Array<String>) {
parseType("hello")
parseType(10)
}
//泛型函式
fun<T> parseType(type:T)
{
when(type){
is Int-> println("整形")
is String-> println("字串")
else-> println("不知道型別")
}
}
輸出:
4、型別擦除
fun main(args: Array<String>) {
var box1=Box<String>("張三")
var box2=Box<Int>(10)
//class型別
var clz1=box1.javaClass.name
var clz2=box2.javaClass.name
println(clz1)
println(clz2)
}
class Box<T> (var value:T)
輸出:
可以看到兩個值是相同的
5、獲取泛型型別
fun main(args: Array<String>) {
pareType(10)
pareType("張三")
}
//泛型前面加入reified關鍵字,方法前面加上inline關鍵字,就可以在下面獲取泛型型別了
inline fun <reified T> pareType(args:T)
{
val name=T::class.java.name
println(name)
}
輸出:
6、泛型型別投射
out關鍵字(類似於java中的? extends)
fun main(args: Array<String>) {
//可以傳遞Person類以及Person類的子類
var list=ArrayList<Person>()
setList(list)
var list2=ArrayList<Student>()
setList(list2)
}
fun setList(list:ArrayList<out Person>)
{
println(list.size)
}
open class Person
open class Student:Person()
in關鍵字(類似於java中的? super)
fun main(args: Array<String>) {
//可以傳遞Student類以及Student類的父類
var list=ArrayList<Person>()
setList(list)
var list2=ArrayList<Student>()
setList(list2)
var list3=ArrayList<Animal>()
setList(list3)
}
fun setList(list:ArrayList<in Student>)
{
println(list.size)
}
open class Animal
open class Person:Animal()
open class Student:Person()
7、星號投射
類似於java中的問號(?)
fun main(args: Array<String>) {
//*可以傳遞任何型別
var list=ArrayList<Person>()
setList(list)
var list2=ArrayList<Student>()
setList(list2)
var list3=ArrayList<Animal>()
setList(list3)
var list4=ArrayList<String>()
setList(list4)
var list5=ArrayList<Int>()
setList(list5)
}
fun setList(list:ArrayList<*>)
{
println(list.size)
}
open class Animal
open class Person:Animal()
open class Student:Person()
相關文章
- 泛型類、泛型方法及泛型應用泛型
- 【java】【泛型】泛型geneticJava泛型
- 泛型類和泛型方法泛型
- 泛型--泛型萬用字元和泛型的上下限泛型字元
- TypeScript 泛型介面和泛型類TypeScript泛型
- Go 泛型之泛型約束Go泛型
- 泛型泛型
- 泛型最佳實踐:Go泛型設計者教你如何用泛型泛型Go
- TypeScript 泛型型別TypeScript泛型型別
- 型別 VS 泛型型別泛型
- 泛型類、泛型方法、型別萬用字元的使用泛型型別字元
- 泛型(一)泛型
- 泛型(三)泛型
- 泛型(二)泛型
- 泛型(四)泛型
- 泛型(五)泛型
- Java泛型Java泛型
- 泛型viewmodle泛型View
- 泛型(Generic)泛型
- Go 泛型Go泛型
- 【譯】在非泛型類中建立泛型方法泛型
- 泛型型別(.NET 指南)泛型型別
- Java函式泛型List引數,操作泛型元素Java函式泛型
- Go 官方出品泛型教程:如何開始使用泛型Go泛型
- 第十五章:指標型別指標型別
- Java 泛型原理Java泛型
- java泛型一二Java泛型
- TypeScript 泛型相容TypeScript泛型
- C#泛型C#泛型
- TypeScript 工具泛型TypeScript泛型
- Java(7)泛型Java泛型
- 介面即泛型泛型
- TypeScript 泛型限定TypeScript泛型
- 【C#】-泛型C#泛型
- go泛型教程Go泛型
- Java-泛型Java泛型
- python使用泛型Python泛型
- Java+泛型Java泛型