我试图了解Scala中的类型参数。让我们看看以下一般示例:
def func1[T](a : T) : T = a
我知道func1接受任何类型的1个参数,并返回相同类型的参数。我不明白的原因是:
def func1[T]
为什么[T]在function1之后?我们可以在func1之后不用[T]编写它,如:
def func1(a : T) : T = a
1)在func1之后,[T]意味着什么?为什么我们把它放在那里?
2)为什么我们对班级做同样的事情?
class MyClass[T]{...}
我的意思是MyClass实例是MyClass类型。那里[T]意味着什么? 你不是说我有一个MyClass类型的布尔类,你说我有一个类型为MyClass的对象吗?
提前致谢。
答案 0 :(得分:5)
func1
之后[T]的含义是什么,我们为什么要把它放在那里? [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
您经常希望在类中包含某种类型的对象。如果在类级别定义类型参数,则类型将在整个类中保持不变。考虑这个例子:
class Container[T](val t: T) {
def isValueEqual(obj: T): Boolean = t.equals(obj)
}
此处,T
中的obj: T
与T
中定义的Container[T]
的类型相同。现在考虑这个例子:
class Container[T](val t: T) {
def isValueEqual[T](obj: T): Boolean = t.equals(obj)
}
请注意,我也在方法级别定义了一个新的类型参数(isValueEqual[T]
)。在这种情况下,方法中定义的T
将影响类级别上定义的T
。这意味着它们可能不是同一类型!你可以这样称呼它:
val c = new Container("Hello")
println(c.isValueEqual(5)) // 5 is not of type String!