为什么下面的错误?如何解决它?
编辑:我假设因为A和B编译成(接口,类)对,所以在编译C时选择正确的静态方法调用是一个问题.我希望优先级按顺序排列.
scala> trait A { def hi = println("A") }
defined trait A
scala> trait B { def hi = println("B") }
defined trait B
scala> class C extends B with A
<console>:6: error: error overriding method hi in trait B of type => Unit;
method hi in trait A of type => Unit needs `override' modifier
class C extends B with A
scala> trait A { override def hi = println("A") }
<console>:4: error: method hi overrides nothing …
Run Code Online (Sandbox Code Playgroud) 如何将java.util.Map [String,Object]转换为scala.collection.immutable.Map [String,Any],以便将原始映射中的所有值(整数,布尔值等)转换为正确的值在Scala工作得很好.
这有效:
class ButtonCountObserver {
private var cnt = 0 // private field
def count = cnt // reader method
def count_=(newCount: Int) = cnt = newCount // writer method
// ...
}
val b = new ButtonCountObserver
b.count = 0
Run Code Online (Sandbox Code Playgroud)
但事实并非如此
class ButtonCountObserver {
private var cnt = 0 // private field
def count_=(newCount: Int) = cnt = newCount // writer method
// ...
}
val b = new ButtonCountObserver
b.count = 0
Run Code Online (Sandbox Code Playgroud)
我明白了: error: value count is not a …
我怎样才能做到这一点:
class Foo {
public static Foo get() throws Exception {
ClassLoader cl = new URLClassLoader(new URL[]{"foo.jar"}, null); // Foo.class is in foo.jar
return (Foo)cl.loadClass("Foo").newInstance(); // fails on class cast
}
}
Run Code Online (Sandbox Code Playgroud)
我需要的是让JVM从cl中考虑Foo实例,就好像它是来自执行代码的类加载器的Foo实例一样.
我见过这些方法,对我来说都没有好处(上面的例子是玩具示例):
我想有一种方法,'mvn install'将文件放在我的源(checkout)根目录下的存储库文件夹中,同时使用来自〜/ .m2/repository的第三方依赖项.
所以在'mvn install'之后,布局是:
/work/project/
repository
com/example/foo-1.0.jar
com/example/bar-1.0.jar
foo
src/main/java
bar
src/main/java
~/.m2/repository
log4j/log4j/1.2/log4j-1.2.jar
Run Code Online (Sandbox Code Playgroud)
(特别是/ work/project/repository不包含log4j)
在本质上,我正在寻找一种创建引用其他存储库的复合存储库的方法
我的目的是能够对同一个源进行多次检出并在每个检查上使用"install"在本地存储库中相互覆盖.多次检查可能是因为在cvs/svn中的不同分支上工作,但在我的情况下,这是由于在git中克隆主分支(在git中,每个克隆就像一个分支).我不喜欢每次结账时使用特殊版本/分类器或每次切换时重新安装(重建)所有内容的替代方案.
如果我想在Scala中为类添加方法,我需要执行以下操作:
class RichFoo(f: Foo) {
def newMethod = f.bar()
}
object RichFoo {
implicit def foo2Rich(f: Foo) = new RichFoo(f)
}
Run Code Online (Sandbox Code Playgroud)
然后f.newMethod
将导致RichFoo
实例的创建并调用其方法.
我试图理解为什么它没有像Ruby那样定义:
override class Foo {
def newMethod = bar
}
Run Code Online (Sandbox Code Playgroud)
编译器可以查看此定义,并使用静态方法newMethod创建一个FooOverride类,该方法获取类型为Foo的参数并调用其bar方法.这就是Scala实现特征的方式.我仍然需要导入包含Foo覆盖的包来使用它.
它似乎涉及较少的输入,不需要我创建名称,并具有更好的性能(不调用方法和创建对象).隐式转换方法所做的任何事情都可以在附加方法中完成.
我确定我错过了一些东西,并想深入了解一下.
对于immutable.Map实例,getOrElseUpdate的惯用方法是什么?我使用下面的代码片段,但它似乎冗长而低效
var map = Map[Key, Value]()
def foo(key: Key) = {
val value = map.getOrElse(key, new Value)
map += key -> value
value
}
Run Code Online (Sandbox Code Playgroud) 如果我模拟一个方法来返回某个对象的新实例,我该如何捕获返回的实例?
例如:
when(mock.someMethod(anyString())).thenAnswer(new Answer() {
Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
Object mock = invocation.getMock();
return new Foo(args[0])
}
});
Run Code Online (Sandbox Code Playgroud)
显然,我可以有一个Foo类型的字段,answer
并将其设置为新实例,但是有更好的方法吗?像ArgumentCaptor这样的东西?
我想以一种不在Bean中创建对Spring的依赖的方式注入类路径资源的URL.意思是,bean不应该使用Spring的接口/类.我怎样才能做到这一点?
有没有办法在O(1)时间内将可变映射转换(换行)为不可变(也就是说,不是通过复制值,而是类似于在JavaConversions中完成的操作)
scala ×6
java ×4
classloader ×1
maven-2 ×1
mockito ×1
overriding ×1
repository ×1
spring ×1
traits ×1