从Scala 2.7.2开始,有一些叫做ManifestJava类型擦除的解决方法.但是,如何Manifest确切地工作以及为什么/何时需要使用它?
Jorge Ortiz 的博客文章Manifests:Reified Types解释了其中的一些内容,但它没有解释如何将它与上下文界限一起使用.
那么ClassManifest,有什么区别Manifest?
我有一些代码(一个更大的程序的一部分,不能轻易地包含在这里),它有关于类型擦除的一些警告; 我怀疑我可以通过使用清单解决这些问题,但我不确定如何解决.
这不起作用:
def giveArray[T](elem:T):Array[T] = {
new Array[T](1)
}
Run Code Online (Sandbox Code Playgroud)
但这样做:
def giveList[T](elem:T):List[T] = {
List.empty[T]
}
Run Code Online (Sandbox Code Playgroud)
我确信这是一个非常基本的东西,我知道Arrays在Scala中表现得有点不寻常.
有人可以向我解释如何创建这样一个数组,以及为什么它首先不起作用?
我有一个带有复选框的项目列表的Scala应用程序,以便用户选择一些,然后单击一个按钮将它们向上移动一个位置(左).我决定编写一个函数来移动某些符合给定谓词的任意类型的元素.所以,如果你有这些元素:
a b c D E f g h I
Run Code Online (Sandbox Code Playgroud)
并且谓词是"大写字符",该函数将返回:
a b D E c f g I h
Run Code Online (Sandbox Code Playgroud)
简而言之,符合谓词的任何连续元素序列都与其左侧的单个元素交换.
我想出了以下丑陋的命令式实现.我希望看到一个很好的,希望可读的功能解决方案.
def shiftUp[T](a:Array[T], shiftable: T => Boolean) = {
val s = new Array[T](a.length)
var i = 0
var j = 0
while(i < a.length)
{
if(!shiftable(a(i)) && i < a.length - 1 && shiftable(a(i+1)))
{
var ii = i + 1
while(ii < a.length && shiftable(a(ii)))
{
s(j) = a(ii)
ii = ii+1
j = j+1
}
s(j) …Run Code Online (Sandbox Code Playgroud)