gpt4 book ai didi

Scala:是否可以将类型参数限制为非抽象?

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

Scala:是否可以将类型参数限制为非抽象的?

除了类型参数和抽象类型成员的 View 边界、上限和下限之外,是否还有其他约束?例如,在我熟悉的 C# 中,您有额外的通用约束:

where T: Class//不确定 T<: AnyRef 是否包含在 Scala 中

其中T:接口(interface)

其中 T:结构

where U: T//裸类型约束

where T: new ()//这确保了类型参数是非抽象的,并允许在泛型类中实例化该类型的对象。

最后一个特别重要,因为它允许您构造未知类型,但遗憾的是您只能禁止无参数构造函数。

=:= <:< 和 <%< 只能用于方法参数吗?

作为对评论的回应,该问题的直接触发因素是需要“T:new()”约束或某种等效机制。

class ExampleClass[T <: AnyRef] {
val example: T = new T()//Won't compile as the compiler
} //doesn't know if such a constructor exists

某些 C# 约束的使用特定于 C# 的需要。例如,人们一直想要的 C# 中没有的一个限制是“T: numericType” 这个问题已经在 Scala 中解决了。我仍然非常努力地使用 Scala 语言,所以除了上述内容之外,我只是想弄清楚在 Scala 语法的这个方面哪些工具是可用的,哪些工具是不可用的,即使我没有确切地知道我可能想如何在 Scala 上下文中使用它们。

我不确定这是否完全相关,但有时编译器(Eclipse 2.1.0.M1 和 Eclipse 3.7.2)似乎不允许我实例化未知元素类型的集合。下面的代码现在似乎编译得很好。所以我想知道规则是什么:
abstract class Descrip [T <: DTypes]()
{
val hexs: MutableList[T#HexT] = new MutableList[T#HexT] //compiles fine
val sides: MutableList[T#SideT] = new MutableList[T#SideT] //compiles fine
}

最佳答案

需要new T()通常使用 Manifest 解决s。例如这段代码编译:

class ExampleClass[T: Manifest] {
val example: T = manifest[T].erasure.newInstance().asInstanceOf[T]
}

缺点是如果 T ExampleClass实例化没有无参数构造函数,它将在运行时失败...

关于 Numeric , Ordering等,它们是类型类并且是标准库的一部分,而不是语言的一部分。您可以构建自己的类型类。 Manifest的案例|之所以特别,是因为它确实支持语言提供隐式对象。

关于Scala:是否可以将类型参数限制为非抽象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10726528/

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