Scala 中的泛型类
在 Scala 中,形成泛型类与在Java中形成泛型类极为相似。像参数一样接受类型的类在 Scala 中被称为泛型类。此类采用方括号内的参数类型,即 [ ]。这些类被显式地用于 Scala 中集合类的进展。泛型类型的子类型是不变的,即,如果我们有两个列表类型,A 和 B,那么 List[A] 是 List[B] 的子类型当且仅当类型 B 等价于类型 A。
需要记住的几点:
- 用于简单类型的类型参数的符号是 A ,如 List[A]。
- 用于第二、第三、第四等类型参数的符号,泛型类中的类型分别为B、C、D等。
- 在 Scala Map 中,键的符号是A ,值的符号是B。
- 用于数值的符号是N 。
注意:尽管提供了此符号约定,但仍然可以将任何符号用于类型参数。
让我们在下面讨论一些例子。
例子:
// Scala program of forming
// Generic classes
// Creating an object
object GfG
{
// Main method
def main(args: Array[String])
{
// Class structure for Generic
// types
abstract class Divide[z]
{
// Defining method
def divide(u: z, v: z): z
}
// Extending Generic class of
// type parameter Int
class intDivide extends Divide[Int]
{
// A method returning Int
def divide(u: Int, v: Int): Int = u / v
}
// Extending Generic Class of
// type parameter Double
class doubleDivide extends Divide[Double]
{
// A method returning Double
def divide(u : Double, v : Double) : Double = u / v
}
// Creating objects and assigning
// values to the methods called
val q = new intDivide().divide(25, 5)
val r = new doubleDivide().divide(21.0, 5.0)
// Displays output
println(q)
println(r)
}
}
输出:
5
4.2
在这里,抽象类Divide有一个类型参数z ,它出现在方括号中,所以该类是泛型类型,这个类型参数z可以占用每个数据类型。我们在 Generic 类中定义了一个方法divide ,它有两个变量,即u和v ,这些变量的数据类型是z 。如上所述的类intDivide采用整数类型,而如上所述的类doubleDivide采用双精度类型。因此,类型参数z被Int和Double数据类型取代。通过这种方式,在通用类中可以进行子类型化。
例子 :
// Scala program of using generic
// types for numeric values
import Numeric._
// Creating an object
object GfG
{
// Main method
def main(args: Array[String])
{
// Defining generic type for numeric
// values with implicit parameter
def addition[N](a: N, b: N)(implicit num: Numeric[N]):
// Using a method 'plus'
N = num.plus(a, b)
// Displays the sum of two
// numbers
println("The sum is : "+addition(88, 12))
}
}
输出:
The sum is : 100
在这里,我们看到了数值的泛型类型参数,因此,我们在这里使用了符号N ,尽管任何符号都可以用作泛型类型的类型参数。