TL;DR:似乎类型别名的类型参数(例如< code>type T[X
考虑一个旨在表示泛型类型子集的类型别名。例如,让我们说我想要一个用于Serializable
事物列表的类型:
scala> type SerializableList[T <: Serializable] = List[T]
defined type alias SerializableList
现在假设我想要一个带有以下参数的case类:
scala> case class NetworkDataCC(things: SerializableList[_])
<console>:9: error: type arguments [_$1] do not conform to type SerializableList's type parameter bounds [T <: Serializable]
case class NetworkDataCC(things: SerializableList[_])
好吧,这不起作用。Scala(令人讨厌的)不带有类型的参数边界,但它很容易修复:
scala> case class NetworkDataCC(things: SerializableList[_ <: Serializable])
defined class NetworkDataCC
好。看起来不错。现在,如果我只想要一个包含这些东西的常规类,但我再次忘记显式声明类型边界,该怎么办?我预计会出现错误:
scala> class NetworkData(val things: SerializableList[_])
defined class NetworkData
哦,等等。无错误...哼。
那么,现在我可以这样做了吗?
scala> new NetworkData(List(1))
res3: NetworkData = NetworkData@e344ad3
嗯,那好像很破。case类当然工作正常(因为声明了限制):
scala> NetworkDataCC(List(1))
<console>:11: error: type mismatch;
found : Int(1)
required: Serializable
NetworkDataCC(List(1))
在我的项目中,我正在利用反射来生成一些关于我的类的元数据。非大小写类的元数据显示事物
缺乏界限:
scala> classOf[NetworkData].getDeclaredFields()(0).getGenericType
res0: java.lang.reflect.Type = scala.collection.immutable.List<?>
而 case 类是正确的:
scala> classOf[NetworkDataCC].getDeclaredFields()(0).getGenericType
res1: java.lang.reflect.Type = scala.collection.immutable.List<? extends scala.Serializable>
为此,我在scala编译器错误跟踪器中找不到任何错误。我是否误解了这些界限应该如何使用?
默认情况下,Scala的下划线不等价于SerializableList[X forPart{type X}]
:
scala> def aa(a: SerializableList[_]) = a
aa: (a: SerializableList[_])List[Any]
scala> def aa(a: SerializableList[X forSome {type X}]) = a
<console>:11: error: type arguments [X forSome { type X }] do not conform to type SerializableList's type parameter bounds [T <: Serializable]
def aa(a: SerializableList[X forSome {type X}]) = a
^
scala> class NetworkDataCC(things: SerializableList[X forSome {type X}])
<console>:11: error: type arguments [X forSome { type X }] do not conform to typ
e SerializableList's type parameter bounds [T <: Serializable]
class NetworkDataCC(things: SerializableList[X forSome {type X}])
它相当于
scala> def aa(a: SerializableList[X] forSome {type X} ) = a
aa: (a: SerializableList[_])List[Any]
所以这样的“无界”行为是可以的。看看这个答案:https://stackoverflow.com/a/15204140/1809978
Case类似乎有额外的类型限制(由于这个bug,影响了为case类自动生成的< code>unapply方法)。
如果想在case类中拥有“无界”存在类型,只需显式指定高阶类型:
scala> case class NetworkDataCC[SerializableList[_]](things: SerializableList[_])
warning: there were 2 feature warning(s); re-run with -feature for details
defined class NetworkDataCC
scala> NetworkDataCC(List(1))
res5: NetworkDataCC[List] = NetworkDataCC(List(1))
甚至:
scala> type SLL = SerializableList[_]
defined type alias SLL
scala> case class NetworkDataDD(things: SLL)
defined class NetworkDataDD
因此,这肯定是一个错误,您可以使用语义等价的类型别名来解决它(参见SI-8997)
我在使用fs.readfile进行同步时遇到了一个问题,他们没有在第一次初始化,如果我再次尝试请求,那么我就有结果了。我知道我可以用promise和我从Kriskowal找到一些有用的东西。我试过但没有成功。我不太明白如何实施它。如果有人能帮忙,我将永远感激。 代码:
我正在制作应用程序与视频播放器在它和我的整个结构是为只有肖像视图,除了这个视频播放器。我只想为这个视图启用景观旋转。但是我在很多论坛上做了很多文章,每一篇文章都是为了给App Delegate添加一些代码,但是我没有。那我能做什么。
问题内容: 在Go中,如果您定义新类型,例如: 然后,您不能将a传递给需要int的函数,反之亦然: 精细。但是,为什么同样的不适用于功能呢?例如: 现在,我没有抱怨,因为它使我不必像在第一个示例中那样必须显式转换为type 。看起来似乎不一致。我敢肯定有充分的理由。谁能启发我? 我问的原因主要是因为我想以这种方式缩短一些较长的函数类型,但是我想确保这样做是可以预期的并且可以接受的:) 问题答案:
我有一门课: 问题是,只有我实例化了那个类,它才会运行。 不管怎样,我怎么能强迫它运行呢?
我想知道在使用TypeScript时,是否有任何工具或技术用于对对象数据进行低级验证。一个例子是HTTP服务上的POST请求的JSON主体。通常,我为预期的数据创建了一个接口,然后将数据强制转换到该接口,但我知道这是肤浅的。 结合静态和运行时类型检查以提高开发效率