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:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章