簡體   English   中英

Scala-Java interop-是否可以從scala中“選擇”被調用的java方法?

[英]Scala - Java interop - is it possible to “choose” the called java method from scala?

我在Scala代碼(scala 2.10.4)中調用Jedis(Java)時遇到一些互操作性問題。

我有一個在隱式類中實現的特征

在基礎類上調用方法時出現以下錯誤

implicit class Redis(private val underlying: Jedis) extends com.dy.storage.Redis {
    override def del(keys: String*): Long = {
      underlying.del(keys: _*)
    }

    override def del2(keys: Seq[Array[Byte]]): Long = {
      underlying.del(keys: _*)
    }
}

收到以下錯誤( scala 2.10.4 ):

no `: _*' annotation allowed here
[error] (such annotations are only allowed in arguments to *-parameters)
[error]       underlying.del(keys: _*)
[error]                          ^
[error] /Users/avnerbarr/workspace/redis-hashed-no `: _*' annotation allowed here
[error] (such annotations are only allowed in arguments to *-parameters)
[error]       underlying.del(keys: _*)
[error]                          ^

我試圖添加一個包裝器並將有問題的調用移到隱式類之外:

    override def del(keys: String*): Long = {
      Wrapper.delete(underlying, keys)
    }


object Wrapper {
  def delete(u : Jedis, str: Seq[String]): Long = {
    u.del(str:_*)
  }
}

然后出現此錯誤:

overloaded method value del with alternatives:
[error]   (x$1: String)Long <and>
[error]   (x$1: <repeated...>[String])Long <and>
[error]   (x$1: Array[Byte])Long <and>
[error]   (x$1: <repeated...>[Array[Byte]])Long
[error]  cannot be applied to (Char)
[error]     u.del(a:_*)
[error]       ^
[info] Checking every *.class/*.jar file's SHA-1.
[error] one error found

使用scala 2.11時,此代碼構建完全沒有問題,僅在scala 2.10中解決了該問題

是否可以“選擇”而不推論應該調用的正確方法?

您應該提供Jediscom.dy.storage.Redis代碼。

以下代碼編譯:

src / main / java / Jedis.java

interface Jedis {
  long del(String... keys);
  long del(byte[]... keys);
}

src / main / scala / com / dy / storage / Redis.scala

package com.dy.storage

trait Redis {
  def del(keys: String*): Long
  def del2(keys: Seq[Array[Byte]]): Long
}

src / main / scala / App.scala

object App {
  implicit class Redis(private val underlying: Jedis) extends com.dy.storage.Redis {
    override def del(keys: String*): Long = {
      underlying.del(keys: _*)
    }

    override def del2(keys: Seq[Array[Byte]]): Long = {
      underlying.del(keys: _*)
    }
  }
}

build.sbt

name := "scala2104"
version := "0.1"
scalaVersion := "2.10.4"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM