1.泛型类、泛型函数

1)泛型类可以接收任意类型。Package<T>(t: T)

2)泛型类中定义的泛型参数<T>,通常用T(Type)表示,(t: T) 这个表示泛型类Package的主构造函数可以接收T类型的属性。

3)openPackage(): T定义一个返回T类型的泛型函数。

4)fun <R> getProductName(block: (T) -> R): R getProductName的返回值是R(英文的Return),接收一个匿名函数为参数block: (T) -> R,这个匿名函数的参数是T,返回值是R。也就是说,匿名函数的返回值,就是getProductName的返回值。这个和前面讲到的apply、let、run、with等是一样的多参数函数。

//泛型类
class Package<T>(t: T) {
    private val product: T = t
    //泛型函数
    fun openPackage(): T {
        return product
    }
    //多参数泛型函数
    fun <R> getProductName(block: (T) -> R): R {
        return block(product)
    }
}
fun main() {
    val pkg = Package(Phone("IPhone"))
    println(pkg.openPackage())
    println(pkg.getProductName {
        it.name
    })
    val pkg2 = Package(Fruit("Apple"))
    println(pkg2.openPackage())
    println(pkg2.getProductName {
        it.name
    })
}

2.泛型类型约束。上面的泛型类,可以接收任意类型。如果我们只想某个类接收特定类型的,可以使用泛型约束。

1)定义一个父类Fruit和两个子类,Apple和Banana

open class Fruit(val name:String){
}
class Apple(name:String) : Fruit(name){
}
class Banana(name:String):Fruit(name){
}

2)定义泛型类约束:<T:Fruit> 表示只能接收Fruit类或子类。和Java中的<? extends Fruit>作用是一样的。

Kotlin中定义泛型约束

class Package<T:Fruit>(t: T) {
    private val product: T = t
    fun openPackage(): T {
        return product
    }
    fun <R> getProductName(block: (T) -> R): R {
        return block(product)
    }
}
fun main() {
    //定义了泛型约束的类,只能放Fruit的子类
    val pkg = Package(Apple("apple"))
    val pkg2 = Package(Banana("banana"))
    //Phone类型是放不进去的
    val pkg3 = Package(Phone("Iphone"))
}

Java中定义泛型约束

public class Package<T extends Fruit> {
    public T t;
    public Package(T t) {
        this.t = t;
    }
    public T openPackage() {
        return t;
    }
}

3.泛型类接收的参数也可以是一个集合:

class Package<T:Fruit>(list:List<T>) {
    var list = list
    fun get(index:Int):Fruit = list[index]
}

vararg items: T 就表示可以存放多个。vararg就是对应java中的可变参数。可以用一个数组来接收它Array<out T> ,这里的out 就是协变的意思。表示,可以就收该类或该类的子类。

class Package<T : Fruit>(vararg items: T) {
    var itmes: Array<out T> = items
   operator fun get(index: Int): Fruit = itmes[index]
}
fun main() {
    val p = Package22(listOf(Apple("apple")))
    println(p.get(0))
    val p2 = Package(Apple("apple"))
    println(p2[0])
}

4.协变out,逆变in

out T 对应java中的 ?extend T

int T 对应java中的?super T

5.类型擦除

对应java和Kotlin,泛型都值存在于编译期,运行后,就不存在泛型的概念,而是指定类型。

如果我们想要检查所传入泛型的类型,在kotlin中可以使用reified 关键字。在Java中可以通过反射的方式,来获取泛型的类型。

到此这篇关于Kotlin泛型的使用介绍的文章就介绍到这了,更多相关Kotlin泛型内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Kotlin泛型的使用介绍的更多相关文章

  1. ios – 如何在Swift中使用没有类型参数的泛型类?

    解决方法Swift还不像Java那样支持wildcard-stylegenerics(即Animal

  2. ios – 如何在Swift中向下转换/转换结构的泛型类型

    我是否必须将这些存储为Any的数组,然后每次都将它们转换为或者我只是误解某些(或两者)?

  3. ios – 在XCTestCase子类中使用泛型有效吗?

    我有一个XCTestCase子类,看起来像这样.为了简洁起见,我已经删除了setup()和tearDown方法:它的子类看起来像这样:在理论上,这应该按预期工作–编译器不会抱怨任何事情.但是只是当我运行测试用例时,setup()方法甚至没有被调用.但是,它表明当testName()方法应该失败时,测试已经过去了.使用泛型是一个问题吗?我可以很容易地想到很多非通用的方法,但是我很想写这样的测试用例.这是XCTest在Objective-C和Swift之间的互操作性?Ergo您的通用XCTestCase子类不

  4. 泛型 – Xcode构建错误时,我添加枚举到泛型类?

    为什么在将泛型类添加到枚举时会收到错误:错误:但是当我这样做时,我没有收到错误:或这个:解决方法您不能将任何类型嵌套在通用的类型中,反之亦然.换句话说,你不能像类,结构和枚举这样做的事情:和乃至苹果人explained的限制原因:It’sanimplementationlimitation.We’llremovetherestrictiononceourcompilerandruntimearea

  5. ios – 如何通过Swift中的泛型类型构造一个属性?

    我在swift中创建了一个泛型类,我想使用“AdaptorType”类型初始化一个适配器,但是我收到一个编译错误我也尝试在init()中初始化它,但是同样的问题在于使用通用类型AdaptorType初始化适配器属性的正确方法是什么?

  6. ios – Equatable实现似乎不适用于泛型

    我仍然在与Swift仿制药作斗争.今天我发现我的Equatable协议实现不起作用,如果它是从泛型类调用的.我的模特课:类,使用泛型类型:它的子类:当我调用TrackingCache实例的removeEntities方法时,我总是在输出中得到相等的:false,即使id是相同的.但是,如果我直接将方法移动到TrackingCache类,它似乎工作正常!

  7. 泛型 – MonoTouch和支持变体通用接口

    如果是这样,MonoTouch中针对这种情况的推荐解决方法是什么?解决方法这实际上取决于编译器而不是Mono版本.IOW有些东西可能适用于Mono2.10而不适用于MonoTouch6.x.当前版本的MonoTouch附带了smcs编译器和基于2.1的配置文件.较新的功能,如协方差,需要一个完整的4.0编译器和运行时.未来版本的MonoTouch将提供4.0/4.5运行时和编译器.

  8. 寒城攻略:Listo 教你 25 天学会 Swift 语言 - 24 Generics

    它可以避免重复的代码,用一种清晰和抽象的方式来表达代码的意图//泛型是Swift强大特征中的一个,许多Swift标准库都是通过泛型代码构建出来的。{forinenumerate{//遍历索引固定字符串的下标ifvalue==valuetoFind{returnindex}}returnnil}letstrings=["cat","dog","llama","parakeet"]ifletfoundindex=findStringIndex{p

  9. Swift语法基础:7 - Swift的Generics

    在前面,我们知道了Swift中的Protocol和Extensions,现在我们来看看另一个东西:Generics(泛型)1.泛型的声明以及简单使用PS:所谓的泛型其实就是一个比较特殊的数组,它可以存储不同类型的数据,这样子我们在写方法的时候,就不需要再写多一个相同功能而类型不同的方法了.2.枚举类型中的泛型3.特定需求的泛型PS:如果你需要某个指定样式的泛型,那么就必须得在泛型里加上where这

  10. Swift泛型和泛型函数

    1、泛型函数在函数名后面加,参数类型也被声明为T,T成为占位符,函数在每次调用时传入实际的参数类型才决定T的类型funclog4{println}log4log4log4如果有多个不同类型,可以使用其它大写字母,一般习惯使用U,多个占位符使用逗号,隔开:示例如下:funcisEquals->Bool{}占位符不仅可以替代参数类型,还可以替代返回值类型:funcisEquals->T{}2、泛型约束有些占位符必须遵守某种协议,及T占位符后面添加冒号和协议类型,这种表示方式成为泛型约束,它能够替换T的类型。

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部