定义以下代码:
import scala.collection.JavaConversions._
val iter:java.util.Iterator[Any] = Array[Any](1, 2, 3).iterator
def func(a:Any):String = a.toString
def test[T:ClassManifest](iter:java.util.Iterator[Any], func:Any=>T):Array[T] =
iter.map(i=>func(i)).toArray
def testFunc = test(iter, func)
Run Code Online (Sandbox Code Playgroud)
在这里,我需要使用ClassManifest
它来正确编译,否则我得到错误:
scala> def test[T](iter:java.util.Iterator[Any], func:Any=>T):Array[T] =
| iter.map(i=>func(i)).toArray
<console>:11: error: could not find implicit value for evidence parameter of
type ClassManifest[T]
iter.map(i=>func(i)).toArray
^
Run Code Online (Sandbox Code Playgroud)
另一方面,下面使用的替代代码List
不需要这个并编译好.
import scala.collection.JavaConversions._
val iter:java.util.Iterator[Any] = Array[Any](1, 2, 3).iterator
def func(a:Any):String = a.toString
def test1[T](iter:java.util.Iterator[Any], func:Any=>T):List[T] =
iter.map(i=>func(i)).toList
def testFunc1 = test1(iter, func).toArray
Run Code Online (Sandbox Code Playgroud)
请注意,最终输出testFunc
和testFunc1
相同.
为什么List …
Scala编译器当前无法推断递归方法的返回类型,如以下代码所示
def foo(i:Int) = if (i > 0) foo (i-1) else 0
Run Code Online (Sandbox Code Playgroud)
上述声明中是否存在任何矛盾?(即,除了Int
可能以外的任何类型?)
我可以想象,在更复杂的例子中,很难推断出类型.
是否有可能进一步描述递归方法的情况,我们可以(不)推断出类型?
[编辑:]编译器足够聪明,可以发现这String
是不正确的.
scala> def foo(i:Int):String = if (i > 0) foo (i-1) else 0
<console>:5: error: type mismatch;
found : Int(0)
required: String
Run Code Online (Sandbox Code Playgroud) 在Scala,如果我们有
class Foo(bar:String)
Run Code Online (Sandbox Code Playgroud)
我们可以创建一个新对象但无法访问 bar
val foo = new Foo("Hello")
foo.bar // gives error
Run Code Online (Sandbox Code Playgroud)
但是,如果我们宣布Foo
成为case class
这个工程:
case class Foo(bar:String)
val foo = Foo("hello")
foo.bar // works
Run Code Online (Sandbox Code Playgroud)
因为这个原因,我被迫将我的许多课程作为案例课程.否则,我必须编写样板代码来访问bar
:
class Foo(bar:String) {
val getbar = bar
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
我想第二个值得一个单独的问题.
我正在尝试为演示项目构建静态分析工具.我们可以自由选择要分析的语言.我从使用ANTLR编写Java代码分析器开始.我现在想对Scala代码做同样的事情.但是,我找不到Scala的ANTLR语法.它存在吗?Scala语法还有其他机器可读的形式吗?
我有一些从本地HTML文件加载的JavaScript代码(无需通过网络服务器)..即,打开使用 file://
有没有办法将此文件中的JavaScript代码用于写入本地文件?
我知道跨站点限制不允许在JavaScript中使用很多东西,但这不是跨站点的,所以理论上应该允许它.
请考虑以下Scala代码.
val a = "both"
a match {
case "both" | "foo" => println ("foo") // case 1
case "both" | "bar" => println ("bar") // case 2
}
Run Code Online (Sandbox Code Playgroud)
我想match
工作,如果a == "both"
,Scala将执行这两种情况.这是可能的还是有任何替代方案来实现我想要的?
考虑以下Scala代码(例如,在REPL中)
object A{def foo:Unit = {}}
object B{def foo:Unit = {}}
def bar[T <: Any {def foo: Unit}](param: T*):Unit = param.foreach(x => x.foo)
bar(A, A) // works fine
bar(B, B) // works fine
bar(A, B) // gives error
Run Code Online (Sandbox Code Playgroud)
前两个工作正常.第三个给出错误:
error: inferred type arguments [ScalaObject] do not conform to method bar's type parameter bounds [T <: Any{def foo: Unit}]
有什么方法可以做我想要的吗?
我已经使用Scala大约一年了,现在想进入Lift.在官方网站之后,我在http://simply.liftweb.net/index-Chapter-2.html#toc-Chapter-2获得了指南
但是,该示例不起作用.这是我得到的错误.
C:\Lift\hello>sbt update ~jetty-run
C:\Lift\hello>set SCRIPT_DIR=C:\scala\bin\
C:\Lift\hello>java -Xmx512M -jar "C:\scala\bin\sbt-launch.jar" update ~jetty-run
[info] Set current project to default-7944be (in build file:/C:/Lift/hello/)
[success] Total time: 0 s, completed 22 Feb, 2012 3:41:06 PM
[error] Not a valid command: jetty-run
[error] Not a valid project ID: jetty-run
[error] Not a valid configuration: jetty-run
[error] Not a valid key: jetty-run (similar: run)
[error] ~jetty-run
[error] ^
Run Code Online (Sandbox Code Playgroud)
我以前没有使用过sbt,并且不想因为必须学习sbt,maven或其他东西而陷入困境.我本质上想要一个"hello"世界应用程序(在这种情况下,聊天应用程序)启动并运行,然后再进一步深入了解Lift.
不幸的是,官方"入门"指南中的第一个例子被打破了.任何想法错误是什么.我尝试了http://groups.google.com/group/simple-build-tool/browse_thread/thread/60635edfadbcd816建议的方法,没有任何运气
假设我有一个java项目myProject
并且正在使用外部库jar(someJar.jar
),它有一个类com.somepackage.Class1.class
.
现在我找到一个更新版本Class1.java
修复了原始jar中的错误.
我Class1.java
在包的源代码中包含了newcom.somepackage
当我构建项目时(例如,使用Netbeans),有一个dist\myProject.jar
包含类com.somepackage.Class1.class
和一个dist\lib\someJar.jar
包含具有相同名称的类的类.
当我运行文件(例如,使用java -jar dist\myProject.jar
)时,使用新版本Class1.class
(如我所愿).
Java如何决定在出现这种重复的情况下运行哪个类文件?有什么办法可以指定优先顺序吗?
有没有"正确"的方法来避免这种冲突?
在Proguard中,当我尝试压缩代码时,出现duplicate class
错误.我该如何消除这个?
假设一些程序员给我一个可执行jar(来自Java代码)以及要使用的入口点.我想在受限制的沙箱环境中从Java代码运行此jar(以编程方式),没有网络或文件系统访问或数据库访问以及固定数量的CPU和内存.即,Java代码不应该对我的jvm上运行的其他程序造成任何副作用.
理想情况下,我想根据情况允许某些访问(例如,只有某个目录中带有配额的文件).