问题标签 [type-bounds]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - Type Bounds 中的下划线 (_) 是否有特殊含义?
我试图理解 Scala 的存在类型。
有什么区别:
和
还是它们不仅仅是未命名的类型参数?
scala - 提取器:推断的类型参数 X 不符合方法 unapply 的类型参数边界
在下面的例子中,Scala 不能使用提取器,这让我发疯:
这是一个测试用例:
失败了
(在 Scala 2.9.2 和 2.10 中)。
如果我删除 F-bound 它可以工作:
我想这是那些“讨厌 Scala 的日子”之一。这可以这么傻吗?基本上它和这个问题一样,没有正确的答案。
谢谢。
scala - 获取 Scala 类型绑定错误:未找到:类型 <%<
所以我一直在尝试通过twitter Scala school学习 Scala 。但我目前停留在他们的类型绑定示例之一。
<%<
特别是,它是使用类型关系运算符将类型绑定为特定类型的类型。
当我在 Scala 控制台中执行以下代码时:
...我收到以下错误:
我的问题是,为什么 Scala 解释器会抱怨?
我一直在尝试浏览 Scala 文档,但我无法在任何地方找到该操作员的信息。我可以看到 Scala 学校是在 Scala 2.8.0 的基础上创建的,而我正在运行 Scala 2.10.0 - 所以也许这已经被删除了?如果是这种情况,为什么这似乎是一个有用的运算符?
scala - 在方法定义中重用 Scala 类型作为边界
是否可以编写这样的内容并重用 HelperTest.AnyHelper 类型?
目前我被迫写这个,因为编译器不会让我:
还是我完全走错了路?
scala - Scala:为什么不强制存在类型声明的下限?
假设在 Scala repl 中做了以下声明:
正如我所料,SubType
是一种符合Bird
. 由于Animal
是 的超类Bird
,因此类型的变量SubType
不能保存类型的值Animal
:
然而这个推论并不像我预期的那样:
分配成功,这些也是如此:
同样,这里是SuperType
:
根据SLS 4.3,
类型声明 type t [tps ] >: L <: U将t声明为具有下限类型L和上限类型U的抽象类型。
所以我声明t
是一个具有下界的抽象类型Bird
。 Chicken
不是 的超类Bird
,既不是String
也不是Int
。
我想这可能是因为 aChicken
是一个Any
并且 aSuperType
可以存储一个Any
. 但是,如果我将声明更改为SuperType
:
设置什么都没有的上限Animal
似乎没有改变。
问题
第一的
我如何分配类型值Chicken
Int
和存在子句允许String
的变量和?SuperType
{ type t >: Bird }
{ type t >: Bird <: Animal}
第二
引用规范中“抽象”一词的含义是什么,“A类型声明 类型 t [tps]>:L <:U声明t是抽象类型......”如果没有“抽象”这个词吗?
java - 为什么在 REPL 中未观察到通配符和存在类型之间的指定等效性
根据Java 编程语言第 4 版。第 15.7.1 节“类型令牌”:
编译器对getClass进行特殊处理:如果在静态类型T的引用上调用getClass,则编译器将getClass的返回类型视为Class。所以这有效:
类中方法的javadocs 提供了getClass
Object
更多详细信息:
实际结果类型 [of
getClass()
]是Class<? extends |X|>
调用|X|
getClass 的表达式的静态类型的擦除。例如,此代码片段中不需要强制转换:
那是 Java 和getClass()
class 的方法Object
。将注意力转移到 Scala,SLS 3.2.10 读取,
存在类型的占位符语法
句法:
Scala 支持存在类型的占位符语法。通配符类型的形式为_ >: L <: U ...通配符类型是存在量化类型变量的简写,其中存在量化是隐含的。
...令T = pc[targs, T, targs']为参数化类型,其中targs , targs'可能为空,并且T是通配符类型_ >: L <: U。那么T等价于存在类型
pc[targs, t, targs] forSome { type t >: L <: U }
其中t是一些新的类型变量。
我在上面强调了“T 等同于存在类型......”,因为我观察到的行为似乎与该陈述不一致。
我做了什么
在 Scala repl 中,我尝试了 SLS 3.2.10 的通配符语法:
这正如我所料。但是,如果我依赖 SLS 3.2.10 中声称的等效性“通配符类型是存在量化类型变量的简写”,我会遇到意外的失败。
错误消息似乎将我递归地引导回 SLS 3.2.10,建议我同时使用通配符语法和表达存在量化。我不明白那是什么意思。无论如何,我使用Object
上面引用的 javadocs 中的示例观察到相同的二分法:
作品:
不工作:
问题
主要是
如果特定的通配符类型与特定的存在类型“等效”,这是否意味着可以用一个替换另一个?这不就是等价的意思吗?假设我正确理解了 SLS 3.2.10 中使用的“等价”的含义,我尝试根据 SLS 3.2.10 中规定的规则进行等效替换是否有错误?repl 如何处理我上面引用的包含与 SLS 3.2.10 一致的存在类型的两个语句的失败,根据这些语句,失败的语句等同于使用成功的通配符类型的语句?
此外
相关错误消息的required行和found行中指定的类型有什么区别?即,这是怎么回事:
不同于
第一个问号是什么?显然?0
意味着什么,它似乎是一个类型变量,但使用这样的问号不是Scala,是吗?那是什么语言,在哪里指定,以便我可以理解该错误消息?
scala - 无法覆盖具有非易失性上限的类型
我在 scala 中有一个编译器错误,我不知道它指的是什么:
假设这些声明:
B
)想要实现的是进一步限制在 中MyType
声明的类型Abstract
,因此任何类型的值都MyType
必须扩展MyType
mixin 树中的所有 s。
编译器给了我这个消息(如标题):
类型 MyType 是易失类型;不能覆盖具有非易失性上限的类型。我知道,由于类型结合,这里发生了类型波动with A#MyType
,错误的一部分:具有非易失性上限的类型可能是指类型声明type MyType <: AInner
,其中AInner
不是抽象类型,因此是非易失性的。
scala - Scala 中类型类的动机是什么?
与类型的上限进行比较时,我在激励 Scala 中使用类型类时遇到了一些麻烦。
考虑以下代码:
虽然这两个列表解决了类似的问题,但一个使用数字类型类,另一个使用类型参数的上限。我非常了解技术差异,但我很难理解类型类的核心动机。到目前为止,我发现的最佳动机如下:
虽然子类化或实现接口允许您进行几乎相同的设计,但类型类允许您在每个方法的基础上指定类型的特征,而具有类型T
和上限的泛型类在使用它的任何地方都受到U
约束。T
考虑到这一点,类型类在泛型类中对 T 的特性提供了更细粒度的控制。
有没有非常明确的例子可以激发这种模式?
scala - Scala 推断类型参数 - 推断为“无”的类型边界
我正在尝试编写一个简单的查询单子,但无法正确获取我的泛型类型注释。
我的第一次尝试如下(为了简洁而大大简化)
编译器不喜欢这样,因为它无法推断“T”的类型。
错误:推断的类型参数 [People.type,Nothing] 不符合方法应用的类型参数边界 [U <: Schema[T],T]
在试验时,我发现使用视图边界可以按预期工作
(注意使用视图绑定“<%”而不是类型绑定“<:”)
然而,在我对类型系统的有限理解中,由于我期待 Schema[T] 的实际子类(而不仅仅是可转换性),我会假设类型绑定“<:”是在这里使用的正确边界?
如果是这种情况,我错过了什么 - 在使用类型边界而不是视图边界时,如何给编译器足够的提示来正确推断 T?
scala - Scala 类型边界和方差
我试图更好地理解以下行为:
但是,以下工作:
我可以看到有界变量的方差和有界变量相反可能存在问题,尽管我不清楚具体问题是什么。我什至不太清楚为什么更改绑定到视图绑定的类型会使事情变得正常。在没有适用的隐式转换的情况下,我希望这两个定义具有大致相同的效果。如果有的话,我希望一个观点一定会提供更多的恶作剧机会。
对于一些背景知识,我定义了在某些方面类似于函数的类,我想做一些类似的事情
可以说
实际上更可取,但我仍然想更好地了解这里发生了什么。