我刚刚看过Daniel Spiewak的演讲,他谈到了结构化类型与Scala的ans Java 标称类型相比的优势。这种差异的一个示例是以下Java代码
public interface Foo {
public int length();
}
public interface Bar {
public int length();
}
Foo f = ...;
Bar b = f;
当然不会编译哪个,因为Foo
和之间的类型兼容性Bar
由名称决定。
另一方面,结构类型系统可以声明两种类型相等或兼容,因此,除其他事项外,还可以进行检查的鸭子类型。
现在,我认为我确实了解结构类型系统的大多数优点,但是我想知道它是否不会从以下示例中使类型安全失效
class Foo {
class Bar { /* ... */ }
def takeBar(b: Bar) = { /* ... */ }
def getBar: Bar = new Bar
}
val foo1 = new Foo
val foo2 = new Foo
foo1.takeBar(foo1.getBar) // should compile
foo1.takeBar(foo2.getBar) // should not compile
我的理解是正确的,在结构类型系统中,最后一行也可以编译,如果这样,这在类型安全方面是否不利?
3
您能解释一下为什么不应该编译最后一行吗?我看不到类型不兼容。
—
山姆·戈德堡
实际上,我想从Scala类型系统的角度对此进行讨论。碰巧,演讲中给出的一个例子是Java。
—
Debilski