我目前正在评估Scala的未来项目,并遇到了一些奇怪的事情.我在JSP中为我们创建了以下常量:
val FORMATED_TIME = "formatedTime";
Run Code Online (Sandbox Code Playgroud)
它没有用.经过一些实验,我决定反编译以找到它的底部:
private final java.lang.String FORMATED_TIME;
public java.lang.String FORMATED_TIME();
Code:
0: aload_0
1: getfield #25; //Field FORMATED_TIME:Ljava/lang/String;
4: areturn
Run Code Online (Sandbox Code Playgroud)
现在这很有趣!就个人而言,我一直想知道为什么检查员需要前缀get和mutator前缀在Java中设置,因为它们位于不同的名称空间中.
然而,向团队的其他成员解释这可能仍然很尴尬.那么没有检查员就可以有一个公共常数吗?
我的java类如下
public class Test {
protected enum TestEnum {A, B, C};
public Test(TestEnum te) {
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的Scala
class ScalaEnum(myEnum: TestEnum) extends Test(myEnum) {
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息
对象中的类TestEnum无法在对象Test中访问Test不允许访问受保护类TestEnum,因为封装类XXX中的类ScalaEnum不是对象的子类在YYY包中定义了target
给定以下Scala对象:
object ScalaObject {
val NAME = "Name"
}
Run Code Online (Sandbox Code Playgroud)
似乎Scala编译器生成一个无参数的方法来访问该NAME字段.但是,当我尝试从Java访问此字段时,看起来访问此字段的唯一方法是作为无参数方法,如:
System.out.println(ScalaObject$.MODULE$.NAME());
Run Code Online (Sandbox Code Playgroud)
有没有办法哄骗Scala编译器,允许Java val按照预期的Java习惯用法访问:
System.out.println(ScalaObject$.MODULE$.NAME);
Run Code Online (Sandbox Code Playgroud) 我想通过与Haskell的比较,我理解Scala 2.10的新"值类"特性newtype:
trait BoundedValue[+This] extends Any { this: This =>
def upperBound: This
def lowerBound: This
}
class Probability @throws(classOf[IllegalArgumentException]) (v: Double) extends AnyVal with BoundedValue[Probability] {
val value: Double = if ((v >= 0.0) && (v <= 1.0)) v else throw new IllegalArgumentException((v.toString) + "is not within the range [0.0, 1.0]")
override val upperBound: Probability = new Probability(0.0)
override val lowerBound: Probability = new Probability(1.0)
// Implement probability arithmetic here;
// will be represented by Double at …Run Code Online (Sandbox Code Playgroud) 我有一个这个代码的类:
package shop.orders.services.email
private[services] class EmailService {...}
Run Code Online (Sandbox Code Playgroud)
然后在另一个包中,我使用该类:
package shop.ui
import shop.orders.services.email.EmailService
class PaymentConfirmation extends WithFacesContext {
var emailService: EmailService = null
Run Code Online (Sandbox Code Playgroud)
查看生成的字节码,没有任何访问修饰符的迹象,这是有道理的,因为Java不支持此类访问限制.那么如果我创建一个包含块1之类的代码的库,并尝试针对库编译块2会发生什么 - 编译器不会失败,因为信息丢失了.或者它是否包含在清单中?
我正在使用Scala 2.9.2.
Scala 没有检查异常.但是,从java调用scala代码时,最好捕获scala抛出的异常.
斯卡拉:
def f()=
{
//do something that throws SomeException
}
Run Code Online (Sandbox Code Playgroud)
Java的:
try
{ f() }
catch (SomeException e)
{}
Run Code Online (Sandbox Code Playgroud)
javac不喜欢这个,并抱怨"这个异常永远不会从try语句体中抛出"
有没有办法让scala声明它抛出一个已检查的异常?
java scala exception-handling compiler-errors scala-java-interop
我想在我的Java Spark应用程序中使用RangePartitioner,但我不知道如何设置两个scala参数scala.math.Ordering<K> evidence$1和scala.reflect.ClassTag<K> evidence$2.有人能举个例子吗?
这是RangePartitioner的JavaDoc链接(对我来说没什么用,因为我是Spark和Scala的新手......):
我的代码实际上看起来像:
JavaPairRDD<Integer, String> partitionedRDD = rdd.partitionBy(new RangePartitioner<Integer, String>(10, rdd, true, evidence$1, evidence$2));
Run Code Online (Sandbox Code Playgroud) 我正在使用asynchttpclient.构建参数时,将java.util.Map传递给setParameters方法.
(Java)签名如下所示:
setParameters(Map<String,Collection<String>);
Run Code Online (Sandbox Code Playgroud)
真实的一天1.但哇,我正试图从Scala中调用它,我不能为我的生活创建一个与该签名相匹配的集合.
这是我到目前为止创造的混乱.
var m:java.util.Map[java.lang.String,java.util.Collection[java.lang.String]] = new java.util.HashMap[java.lang.String,java.util.HashSet[java.lang.String]]()
val req = new RequestBuilder().setUrl("http://localhost:1234/").setParameters(m).build
Run Code Online (Sandbox Code Playgroud)
这是错误信息,
Run Code Online (Sandbox Code Playgroud)Multiple markers at this line - type mismatch; found : java.util.HashMap[java.lang.String,java.util.HashSet[java.lang.String]] required: java.util.Map[java.lang.String,java.util.Collection[java.lang.String]] Note: java.util.HashSet[java.lang.String] <: java.util.Collection[java.lang.String], but Java-defined **trait Map is invariant in type V. You may wish to investigate a wildcard type such as `_ <: java.util.Collection[java.lang.String]`. (SLS 3.2.10)** - type mismatch; found :
很公平,我不会想到我做了一些特别复杂的事情,但是让我们试试编译器的建议......
所以我将其更改为以下内容
var m:java.util.Map[java.lang.String,_ <: java.util.Collection[java.lang.String]] = new java.util.HashMap[java.lang.String,java.util.HashSet[java.lang.String]]()
val req = new RequestBuilder().setUrl("http://localhost:1234/").setParameters(m).build
Run Code Online (Sandbox Code Playgroud)
并收到以下可爱的错误消息作为回应.
Run Code Online (Sandbox Code Playgroud)Multiple markers at …
我试图使用asInstanceOf将java列表转换为Scala列表但没有成功,因为我从android调用返回的列表是一个java列表.
val apList = (wfm.getScanResults:java.util.List[ScanResult])
Run Code Online (Sandbox Code Playgroud)
希望这样做,以便我可以使用(新的Scala)列表进行理解,因为它似乎不喜欢在这个构造中使用java列表给我一个错误.
value foreach is not a member of java.util.List[android.net.wifi.ScanResult]
for (ap<-apList) { .... }
^
Run Code Online (Sandbox Code Playgroud)
他们是一种在for/foreach中使用Java列表而不强制它的方法吗?如果我必须胁迫,怎么样?as asInstanceOf以这种方式使用时调用ar/t错误.
我最近一直在玩Scala/Java互操作,特别是从Java(7)调用Scala(2.10.4)代码.它比我想象的更令人愉快,但有些事情让我困惑.
例如,scala.runtime我有一个很好的AbstractFunction抽象类集合.但我没有看到任何没有返回值的方法.例如,假设我有以下Scala代码:
class MyClass(name: String) {
def SayWhat(say_fn: String => Unit) = say_fn(name)
}
Run Code Online (Sandbox Code Playgroud)
我的理解是Java void或多或少是Scala的Unit,所以我可以通过以下Java匿名类来模糊地传递类似lambda的东西:
import scala.Function1;
import scala.runtime.AbstractFunction1;
import scala.runtime.BoxedUnit;
public class MyProgram {
public static void main(String[] args) {
MyClass mc = new MyClass("Dan");
Function1<String, BoxedUnit> f = new AbstractFunction1<String, BoxedUnit>() {
public BoxedUnit apply(String s) {
System.out.println("Why, hello there " + s);
return null;
}
};
mc.SayWhat(f);
}
}
Run Code Online (Sandbox Code Playgroud)
这显然不是最漂亮的事情,但我AbstractFunction真的很欣赏这些东西,相比之下我不得不做的事情!但是真的没有AbstractProcedure什么东西吗?另外,为什么我的"lambda"必须返回BoxedUnit …
scala ×10
java ×7
apache-spark ×1
covariance ×1
enums ×1
interop ×1
lambda ×1
newtype ×1
partitioning ×1