了解Scala中的类型参数

Spa*_*tan 3 scala type-parameter

我试图了解Scala中的类型参数.我们来看下面的一般例子:

def func1[T](a : T) : T = a
Run Code Online (Sandbox Code Playgroud)

我知道func1接受任何类型的1个参数,并返回相同类型的参数.我不明白的原因是:

def func1[T]
Run Code Online (Sandbox Code Playgroud)

为什么[T]在function1之后?在func1之后我们可以简单地在没有[T]的情况下编写它,例如:

def func1(a : T) : T = a
Run Code Online (Sandbox Code Playgroud)

1)在func1之后,[T]意味着什么?为什么我们把它放在那里?

2)为什么我们对课程做同样的事情?

class MyClass[T]{...}
Run Code Online (Sandbox Code Playgroud)

我的意思是MyClass实例化是MyClass类型.那里[T]意味着什么?你不是说我有一个MyClass类型的布尔类,你说我有一个类型为MyClass的对象吗?

提前致谢.

mar*_*ran 6

  1. 什么是[T]意味着什么func1,为什么我们把它放在那里?

[T]func[T]限定的类型参数T.您的函数可以被调用func[String]("Hello"),其中String替换为T.您也可以调用它,func("Hello")因为Scala编译器非常智能,可以推断出T必须String.

那么为什么我们func[T]在定义时必须写呢?我们需要区分由类型参数给出的类型的参数和由实际类型给出的参数.如果你这样写:def func1(a : T) : T = a,那么T必须是一个实际的类型.例如:

class T

def func1(a : T) : T = a  // <-- This compiles now
Run Code Online (Sandbox Code Playgroud)
  1. 为什么我们对课程做同样的事情?

您经常希望在类中包含某种类型的对象.如果在类级别定义类型参数,则类型将在整个类中保持不变.考虑这个例子:

class Container[T](val t: T) {
    def isValueEqual(obj: T): Boolean = t.equals(obj)
}
Run Code Online (Sandbox Code Playgroud)

这里,Tin obj: TT定义的类型相同Container[T].现在考虑这个例子:

class Container[T](val t: T) {
    def isValueEqual[T](obj: T): Boolean = t.equals(obj)
}
Run Code Online (Sandbox Code Playgroud)

请注意,我在方法级别定义了一个新的类型参数(isValueEqual[T]).在这种情况下,T方法中T定义的阴影将在类级别上定义.这意味着它们可能不是同一类型!你可以这样称呼它:

val c = new Container("Hello")
println(c.isValueEqual(5)) // 5 is not of type String!
Run Code Online (Sandbox Code Playgroud)