标签: scala-java-interop

在Java中使用Scala常量

我目前正在评估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 scala scala-java-interop

8
推荐指数
1
解决办法
3750
查看次数

如何从Scala访问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

enums scala scala-java-interop

8
推荐指数
1
解决办法
3416
查看次数

我可以在没有Java括号的情况下访问Scala对象的val吗?

给定以下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)

java scala scala-java-interop

8
推荐指数
1
解决办法
908
查看次数

用户定义的值类从Java看起来是什么样的?

我想通过与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)

java interop scala scala-java-interop newtype

8
推荐指数
1
解决办法
1868
查看次数

scala访问限定符有哪些保证?

我有一个这个代码的类:

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 scala-java-interop

8
推荐指数
1
解决办法
151
查看次数

在Java中捕获Scala抛出的异常 - 无法访问的catch块

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

8
推荐指数
2
解决办法
1006
查看次数

如何在Spark中使用RangePartitioner

我想在我的Java Spark应用程序中使用RangePartitioner,但我不知道如何设置两个scala参数scala.math.Ordering<K> evidence$1scala.reflect.ClassTag<K> evidence$2.有人能举个例子吗?

这是RangePartitionerJavaDoc链接(对我来说没什么用,因为我是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)

scala partitioning scala-java-interop apache-spark

8
推荐指数
1
解决办法
3477
查看次数

Scala,不喜欢java collections API吗?

我正在使用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)

这是错误信息,

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 : 
Run Code Online (Sandbox Code Playgroud)

很公平,我不会想到我做了一些特别复杂的事情,但是让我们试试编译器的建议......

所以我将其更改为以下内容

 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)

并收到以下可爱的错误消息作为回应.

Multiple markers at …
Run Code Online (Sandbox Code Playgroud)

java scala covariance scala-java-interop

7
推荐指数
1
解决办法
828
查看次数

如何在Scala的foreach中使用Java List?

我试图使用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错误.

java scala scala-java-interop

7
推荐指数
1
解决办法
1万
查看次数

这真的是从Java传递void函数到Scala方法的方法吗?

我最近一直在玩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 …

java lambda scala scala-java-interop

7
推荐指数
1
解决办法
2051
查看次数