Android kotlin 详解(3)

来源:互联网 发布:mac系统怎么重装win10 编辑:程序博客网 时间:2024/06/06 02:04

在这里,我想给大家推荐一个网站:菜鸟教程 https://www.runoob.com/ ,真心不错的网站,知识点讲的很详细。大部分新的语言都是在上面学的。那,接下来我们进入主题,今天我们这篇博客讲kotlin的泛型,在讲kotlin泛型前,我们先来看看java里面的泛型,不然你很可能蒙圈。

java 泛型知识点:

一. 首先我们要知道,当初java为什么提出泛型了?
(1) 泛型消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

(2) 泛型提高了 Java 程序的类型安全。

先让我们来看看java泛型的一个例子:

//java一般写法public void printInfo(int a,int b){    System.out.println(a+"/"+b);}public void printInfo(String a,String b){    System.out.println(a+"/"+b);}//java泛型写法public <T> void printInfo(T a,T b){    System.out.println(a+"/"+b);}

二.java泛型的定义

(1)对于 类 的泛型定义:紧跟类名后面。

public class FanXing<T>{};public class FanXing<T extends User>{};

下面来看个例子:

public class FanXing<T> {    public T printInfo(String a,String b){        return (T) (a+"/"+b);    }}//调用FanXing fanxin=new FanXing<String>();String str=fanxin.printInfo("3","4");

(2)对于 方法 的泛型定义:紧跟修饰符后面

public <T> void printInfo(T a,T b){    System.out.println(a+"/"+b);}

例子,我就里不多说了,上面有这个例子。

三.java通配符(?)

上面有泛型的定义和赋值;当在赋值的时候,上面一节说赋值的都是为具体类型,当赋值的类型不确定的时候,我们用通配符(?)代替。

List<?> unknownList;List<? extends Number> unknownNumberList;List<? super Integer> unknownBaseLineIntgerList; 

例子如下:

    public void testFunction(){        List<String> list = new ArrayList<String>();        list.add("jim");        list.add("trency");        List<?> list1 = list;        //可以读取声明为通配符的集合类的对象          Iterator<?> iterator = list1.iterator();        while(iterator.hasNext()){            System.out.println(iterator.next());        }        //不允许向声明为通配符的集合类中写入对象。唯一例外的是null          //编译时错误,因为我们不知道 "dcdscd","ntnythyt" 的元素类型。          // list1.add("dcdscd");          //list1.add("ntnythyt");        list1.add(null);    }

ps:通配符,赋值时没有给定具体的数据类型。

kotlin 泛型知识点:

**一.**kotlin 泛型的定义

(1)对于 类 的泛型定义:紧跟类名后面

   class Genericity <T>     class Genericity <T>(t:T)

老规矩,例子走起:

class Genericity <T>{    fun printInfo(a:T,b:T){        println("============== $a + $b")    }    fun welCome():T{        var str="welcome to kotlin"        return str as T;    }}//调用    val genericity=Genericity<String>()    genericity.printInfo("3","5")    genericity.welCome()

(2)对于 方法 的泛型定义:放在 fun 关键字 后面。

fun <T> printInfo(a: T, b: T)fun <T :User> printInfo(a: T, b: T)

例子如下:

class Genericity {    fun <T> printInfo(a: T, b: T) {        println("============== $a + $b")    }}//调用    val genericity=Genericity()    genericity.printInfo("3","5")    genericity.printInfo(6,7)

(3)kotlin 的协变

Kotlin 中没有通配符类型,它有两个其他的东西:声明处型变(declaration-site variance)与类型投影(type projections)

a.声明处型变
其实,很简单,直接上例子:

// 定义一个支持协变的类class Runoob<out A>(val a: A) {    fun foo(): A {        return a    }}//调用//协变 out 只能作为输出,且只能下转上//何为下转上:String----》Anyvar strCo: Runoob<String> = Runoob("a")var anyCo: Runoob<Any> = Runoob<Any>("b")anyCo = strCo// strCo = anyCo  //编译不通过println("======="+anyCo.foo())   // 输出 a-------------------------------------------------// 定义一个支持协变的类class Runoob<in A>(a: A) {    fun foo() {//不能有返回值           }}//in 只能作为输入,且只能上转下    var strDCo = Runoob("a")    var anyDCo = Runoob<Any>("b")    strDCo = anyDCo

ps:
这里写图片描述

原创粉丝点击