在这里,我想给大家推荐一个网站:菜鸟教程 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: