为什么使用Foo [T <:Bar]要求Foo [_ <:Bar]而不是Foo [_]

克里奥斯

给定

trait Foo[T <: Bar] {
   def foo: T
}

为什么编译器解释像签名

def foo(f: Foo[_])

意味着未知_ 一定是一种类型Bar相反,它迫使我这样做

def foo(f: Foo[_ <: Bar])

这会使签名复杂化。我敢肯定,编译器必须是正确的,我错过了一些细微之处,但显然Foo[X]那里X不是某种Bar所以不可能通过建设,为什么?

谢谢。

克里奥斯

简而言之-似乎是编译器的缺陷,也是是否解决该问题的一个公开问题。修复它可能会带来意想不到的后果,但是它经常被提出来以至于仍然被认为是可能的修复方法。这是一些最相关且仍在打开的Bug门票。

PS看来Dotty确实尊重这样的界限,所以他们很可能会解决它!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么foo = bar与foo = bar不同?

匹配实例“ foo”而不是“ bar”

什么是`int foo :: * bar :: *`?

为什么 println!(foo.bar()?) 移动 foo?

为什么不要求在赋值`foo = $ bar`中双引号`$ bar`?

为什么在foo:bar()函数调用中使用冒号会返回ReferenceError而不是SyntaxError?

别名“ Bar”类型不是“ Foo”类型的成员

为什么在JavaScript中`(foo)=“ bar”`是合法的?

isinstance(foo,bar)vs type(foo)是bar

哪个是更好的foo :: bar()VS $ foo :: bar()?

foo(bar)和foo(bar,baz)

为什么Foo({})调用Foo(0)而不是Foo()?

Clojure中的:foo,:: foo,:: bar / foo和:bar / foo有什么区别?

当foo被声明为可变的时,要求使用&mut foo而不是&foo的原因是什么?

如何将foo.war的根路径设置为/ foo / bar而不是/ foo?

var [foo] = bar的含义?

foo,bar,baz等的含义

javascript getElementsByClassName(“ foo” ||“ bar”)

在 TS 泛型中,为什么 T != { foo: T['foo'] } & Omit<T, 'foo'>?

为什么“ gcc -E”之后“ foo \\ <NEWLINE> bar”变成“ foo \ bar”?

为什么是“ Foo f(Bar());” 可以是采用Bar类型并返回Foo类型的函数的声明?

foo =“ bar”; if(foo ==“ bar”){doX(); }其他{“但是这总是运行”}为什么?

从函数的输出创建 Bash 关联数组:为什么“declare -A foo=$(bar)”有效,但“declare -A foo; foo=$(bar)”无效?

使用 moduleFor('foo:bar', 'unit@foo:bar') 搜索并替换 moduleFor('foo:bar')

如何计算“ $ foo = 5 && $ bar = 15”,为什么它不是错误?

为什么即使都包含“ foo.h”和“ bar.h”,我也需要转发声明类foo而不是类bar的声明?

理解 Python 中的 [foo for bar, foo in arr]

Javascript foo = foo.bar = foobar

$ foo [“ bar”] = 1; 我可以要求PHP投诉$ foo是否不存在吗?