32得票1回答
在Rust中,生命周期的子类型关系很难理解。

我觉得自己很傻,因为我已经多次浏览了Rust文档中的标记部分以及关于子类型和变异性的维基百科文章,但对生命周期子类型关系的理解并没有提高。 我想我只是习惯了“典型的面向对象编程风格”中的子类型关系,例如“Cat <: Animal”表示“Cat是Animal的一个子类型”,其中“S是T...

17得票5回答
为什么对于forall a. a这种类型,它不被认为是Int的子类型,但我可以在需要Int类型的任何地方使用一个类型为forall a. a的表达式?

考虑以下一对函数定义,它们通过类型检查器:a :: forall a. a a = undefined b :: Int b = a 也就是说,类型为forall a. a的表达式可以被用在期望类型为Int的地方。这对我来说看起来很像子类型化,但据称Haskell的类型系统缺乏子类型化。这些...

16得票2回答
Java规范中在哪里提到了List<T>赋值给List<? super T>?

假设类B继承自类A。下面的Java代码是合法的: List&lt;A&gt; x; List&lt;? super B&gt; y = x; 就规范而言,这意味着 List&lt;A&gt; 赋值给 List&lt;? super B&gt;。然而,我找不到规范中说这是合法的部分。特别是...

16得票2回答
指向派生类和基类之间的指针到指针转换?

关于下面的C++程序: class Base { }; class Child : public Base { }; int main() { // Normal: using child as base is allowed Child *c = new Chil...

16得票1回答
从非协变类型类的实例创建协变类型类的实例

假设我有一个简单的类型类(type class),其实例会给我某种类型(type)的值:trait GiveMeJustA[X] { def apply(): X } 我有一些实例:case class Foo(s: String) case class Bar(i: Int) implic...

16得票1回答
关于Java和Scala中的泛型

我对通用子类型感到困惑。 在Java中,如果类型A是类型B的子类型,那么泛型类型C&lt;A&gt;和C&lt;B&gt;是不变的。例如,ArrayList&lt;Base&gt;不是ArrayList&lt;Derived&gt;的子类型。 然而,在Scala中,如果类型A是类型B的子类...

15得票2回答
为什么OCaml不支持记录子类型?

阅读《类型和编程语言》,我对使用闭包和记录子类型实现对象印象深刻(第18章)。有没有特殊的原因,导致OCaml不支持记录子类型(虽然我知道对象支持)?事实上,我找不到任何支持此功能的语言。

15得票1回答
Haskell的类型系统是否遵守Liskov替换原则?

我来自Java背景,现在正在尝试理解Haskell的类型系统。在Java世界中,里氏替换原则是基本规则之一,我想知道这是否也适用于Haskell(请原谅我对Haskell的了解有限,希望我的问题有意义)。 例如,在Java中,通用的基类Object定义了方法boolean equals(Ob...

12得票1回答
Kotlin中的@uncheckedVariance是什么?

在他的演讲《编译器就是数据库》中,Martin Odersky提出了一个有趣的变量角落情况: class Tree[-T] { def tpe: T @uncheckedVariance def withType(t: Type): Tree[Type] } T的定义是逆变的,因...

12得票2回答
异常处理和强制转换

try { throw Derived(); } catch (Base&amp;) { std::cout &lt;&lt; "subtyping\n"; } try { throw "lol"; } catch (std::string) { std::c...