在這裏,我想給大家推薦一個網站:菜鳥教程 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: