gpt4 book ai didi

scala - 理解 Scala 中的类型参数

转载 作者:行者123 更新时间:2023-12-05 00:16:22 26 4
gpt4 key购买 nike

我试图理解 Scala 中的类型参数。让我们看下面的一般示例:

def func1[T](a : T) : T = a

我知道 func1 接受任何类型的 1 个参数,并返回完全相同类型的参数。我不明白的是为什么:
def func1[T]

为什么 [T] 紧跟在 function1 之后??我们可以简单地在 func1 之后不加 [T] 来编写它,例如:
def func1(a : T) : T = a

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

2)为什么我们对类做同样的事情?
class MyClass[T]{...}

我的意思是 MyClass 实例是 MyClass 类型。 [T] 在那里是什么意思?
你不是说我有一个 MyClass 类型的 bool 类,你说我有一个 MyClass 类型的对象,对吗?

提前致谢。

最佳答案

  • 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)
    }

    在这里, Tobj: TT 的类型相同定义于 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!

    关于scala - 理解 Scala 中的类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41899478/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com