gpt4 book ai didi

scala - 创建类型别名的实例会导致 "class type required"错误

转载 作者:行者123 更新时间:2023-12-04 02:03:27 24 4
gpt4 key购买 nike

通过混合创建了一个新类型 ObservableSetHashSet ,我有点期待替换然后能够使用新类型创建一个新实例,如下面的“foo”。但这不会编译,尽管使用该类型的原始长格式似乎很好(如下面的“bar”所示)。

这只是语言的一个特性还是我做了一些愚蠢的事情?

package whatever

import collection.mutable._
object Whatever {

type ObservableHashSet[T] = HashSet[T] with ObservableSet[T]
class X


def foo {
new ObservableHashSet[X]
}

def bar {
new HashSet[X] with ObservableSet[X]
}
}

错误是..
error: class type required but scala.collection.mutable.HashSet[scala.Whatever.X] with scala.collection.mutable.ObservableSet[scala.Whatever.X] found
new ObservableHashSet[X]

最佳答案

简而言之,您已经为结构类型(您无法实例化)创建了类型别名。

这是您所做工作的简化版本(不起作用):

scala> import collection.mutable._
import collection.mutable._

scala> type ObservableHashSet[T] = HashSet[T] with ObservableSet[T]
defined type alias ObservableHashSet

scala> new ObservableHashSet[String]
<console>:12: error: class type required but scala.collection.mutable.HashSet[String] with scala.collection.mutable.ObservableSet[String] found new ObservableHashSet[String]

现在,该错误确实有一定道理,让我尝试解释原因。

type ObservableHashSet[T] = HashSet[T] with ObservableSet[T]您正在为不是具体类型的事物定义类型别名(或者,正如错误消息所说,不是“类类型”),因此您无法使用 new 创建它的实例.

但这(通过我们创建类类型的中间步骤)有效:
scala> class ObservableHashSet[T] extends HashSet[T]  with  ObservableSet[T]
defined class ObservableHashSet

scala> type obs[T] = ObservableHashSet[T]
defined type alias obs

scala> new obs[String]
res1: ObservableHashSet[String] = Set()

所以,问题是:为什么 scala 允许您创建无法实例化的类型别名?
那么, type ObservableHashSet[T] = HashSet[T] with ObservableSet[T]是结构类型。虽然,正如您在第一段代码中看到的,您无法创建它的实例,但您仍然可以使用它:例如对函数的参数施加结构约束。

看一看:
scala> type ObservableHashSet[T] = HashSet[T]  with  ObservableSet[T]
defined type alias ObservableHashSet

scala> def test(obsHashSet: ObservableHashSet[String]) : String = {"bingo!"}
test: (obsHashSet: ObservableHashSet[String])String

scala> test(new HashSet[String] with ObservableSet[String])
res4: String = bingo!

但是如果我们尝试使用不符合结构类型的参数调用 test ,我们会得到类型不匹配:
scala> test(new HashSet[String])
<console>:13: error: type mismatch;
found : scala.collection.mutable.HashSet[String]
required: ObservableHashSet[String]

关于scala - 创建类型别名的实例会导致 "class type required"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8040963/

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