1.泛型方法
1 2 3 4 5 6 7 8 9 10 11 12 13
|
def getMiddleElement(arr: Array[Int]): Int = arr(arr.length / 2)
def getMiddleElement1[T](arr: Array[T]) = arr(arr.length / 2)
println(getMiddleElement(Array(1, 2, 3, 4, 5))) println(getMiddleElement(Array("hkjcpdd", "hkjmjj", "hkjljj"))) println(getMiddleElement1(Array(1, 2, 3, 4, 5))) println(getMiddleElement1(Array("hkjcpdd", "hkjmjj", "hkjljj")))
|
2.泛型类
1 2 3 4 5 6 7 8 9 10
|
class Pair[T](val message: T) { println(message) }
new Pair[Int](1234) new Pair[String]("hkjcpdd")
|
3.泛型特质
1 2 3 4 5 6 7 8 9 10 11 12
| trait Logger[T] { val a: T def show() = println(a) } object ConsoleLogger extends Logger[String] { override val a: String = "hkjcpdd" }
ConsoleLogger.show()
|
4.泛型上下界之上界
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 使用t < 类型名表示给类型添加一个上界,表示泛型参数必须从该列(或本身)继承. 格式: [T <: 类型] 例如:[T <: Person]的意思是,泛型T的数据类型必须是Person类型或者Person的子类型
abstract class Person { val name: String val age: Int }
class Student extends Person { override val name: String = "hkjcpdd" override val age: Int = 12 }
def demo[T <: Person](array: Array[T]): Unit = println(array)
val s1 = new Student() demo(Array(s1))
|
5.泛型上下界之下界
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| 使用T >: 数据类型 表示给类型添加一个下界,表示泛型参数必须是从类型本身或该类型的父类型. 格式: [T >: 类型] 注意: 1.例如:[T >: Person]的意思是,泛型T的数据烈性必须是Person类型或者Person的父类型 2.如果泛型既有上界又有下界。下界写在前面,上界写在后面,即:[T >:类型1 < 类型2]
abstract class Person1 { val name: String val age: Int }
class Policeman extends Person1 { override val name: String = "hkjmjj" override val age: Int = 14 }
class Superman extends Policeman
def demo1[T >: Policeman](arr: Array[T]) = println(arr)
demo1(Array(new Policeman))
|
6.泛型注意点
[!NOTE]
如果泛型既有上界又有下界。下界写在前面,上界写在后面,即:[T >:类型1 < 类型2]
如果是同一个同事设置了上下界,其实就是直接固定类型,和直接在里面写类型没区别
7.协变、逆变、非变
[!IMPORTANT]
- 非变:类A和类B之间是父子类关系,但是Pair[A]和Pair[B]之间没有任何关系.
- 协变:类A和类B之间是父子类关系,Pair[A]和Pair[B]之间也有父子类关系.
- 逆变:类A和类B之间是父子类关系,但是Pair[A]和Pair[B]之间是子父关系.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Super class Sub extends Super
class Temp1[T]
class Temp2[+T]
class Temp3[-T]
val t1: Temp1[Sub] = new Temp1[Sub] val t2: Temp1[Super] = t1
val t3:Temp2[Sub] = new Temp2[Sub] val t4:Temp2[Super] = t3
val t5: Temp3[Sub] = new Temp3[Sub] val t6: Temp3[Super] = t5 val t7: Temp3[Super] = new Temp3[Super] val t8: Temp3[Sub] = t7
|
8.案例:列表去重排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
val source = Source.fromFile("J:\\大数据第一代项目\\scalaFlink\\data\\123.txt")
val list1 = source.mkString.split("\\s+").toList
val list2: List[Int] = list1.map(_.toInt)
val set1: Set[Int] = list2.toSet
val list3: List[Int] = set1.toList.sorted
val bw = new BufferedWriter(new FileWriter("J:\\大数据第一代项目\\scalaFlink\\data\\123456.txt"))
for (i <- list3) { bw.write(i.toString) bw.newLine() }
bw.close()
|