Android kotlin 详解(3)

在这里,我想给大家推荐一个网站:菜鸟教程 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----》Any
var 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:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值