Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数组映射()期间令人费解的隐式转换_Java_Arrays_Scala_Implicit Conversion_Implicit - Fatal编程技术网

Java 数组映射()期间令人费解的隐式转换

Java 数组映射()期间令人费解的隐式转换,java,arrays,scala,implicit-conversion,implicit,Java,Arrays,Scala,Implicit Conversion,Implicit,我有一个用例,我得到一个包装类的Java数组,例如包装一个int,我想将它们转换为相同数据的值集,但是我遇到了一个令人困惑的隐式转换问题。下面是我正在尝试的Java和Scala示例: …/java/demoapi/SomeWrapper.java …/scala/demo.scala 映射无法编译,出现以下错误: Error:(11, 27) value m_theInt is not a member of demotest.TestEnum.Value in.map(x =>

我有一个用例,我得到一个包装类的Java数组,例如包装一个int,我想将它们转换为相同数据的值集,但是我遇到了一个令人困惑的隐式转换问题。下面是我正在尝试的Java和Scala示例:

…/java/demoapi/SomeWrapper.java

…/scala/demo.scala

映射无法编译,出现以下错误:

Error:(11, 27) value m_theInt is not a member of demotest.TestEnum.Value
    in.map(x => fromInt(x.m_theInt))
                          ^
我的问题是:数组元素的类型是如何转换为TestEnum.Value的?我不得不放弃这些含蓄的东西,但我觉得这应该是可行的


编辑:我确信要让它工作,我还需要做更多的工作,例如可能将数组[TestEnum.Value]转换为一个值集,但我还没有做到这一点。

您希望将数组转换为集合(ArrayOps),以便可以对其进行操作

但是你期望产生一个值集,要做到这一点,机器需要一种方法来构建它,一个CanBuildFrom

这里暗含了这一点:

因为您提供了一种将数组转换为值集的方法,所以它将很高兴地应用它,以便使用CanBuildFrom

-Xprint:typer
向您显示它的方向:

implicit def fromJava(in: Array[demoapi.SomeWrapper]): demoapi.TestEnum.ValueSet = SomeWrapperEx.this.fromJava(in).map[Nothing, demoapi.TestEnum.ValueSet](((x: demoapi.TestEnum.Value) => SomeWrapperEx.this.fromInt(x.<m_theInt: error>)))(demoapi.this.TestEnum.ValueSet.canBuildFrom);
或手工建造:

scala> Days.ValueSet.empty
res1: Days.ValueSet = Days.ValueSet()

scala> res1 + Days.T
res2: Days.ValueSet = Days.ValueSet(T)
这就是CanBuildFrom所做的一切:

scala> implicit val xxx = new collection.generic.CanBuildFrom[Array[Int], Days.Value, Days.ValueSet] {
     | def apply() = Days.ValueSet.newBuilder
     | def apply(from: Array[Int]) = apply()
     | }
xxx: scala.collection.generic.CanBuildFrom[Array[Int],Days.Value,Days.ValueSet] = $anon$1@6b474074

scala> (2 to 5) map (_ => Days.T)
res4: scala.collection.immutable.IndexedSeq[Days.Value] = Vector(T, T, T, T)

scala> (2 to 5) map (Days(_))
res5: scala.collection.immutable.IndexedSeq[Days.Value] = Vector(W, Th, F, Sa)

所以,它使用我正在实现的函数来隐式地将数组参数转换为同一个函数?这很棘手。好,接下来:假设我有一个包含int成员的Java对象的Java数组,那么将其转换为值集的规范方法是什么?我应该只提供一个方法将单个对象转换为单个值,然后让隐式CanBuildFrom东西神奇地将X的容器转换为值集吗?这样行吗?@experquisite如果你想以一个值集结束,就从一个值集开始。好吧,我觉得很密集,但我不能从一个值集开始,我必须从一个数组[Wrapper]开始(因为这就是我正在使用的Java API给我的)。每个包装器对象包装一个整数,其中一个是N到大约40,我想把这个可变长度数组转换成一个值集。目前,由于上述的诡计,我是用手做的,没有任何隐含的东西。啊,我明白了,从对象中过滤出来的东西非常好,我会这样做的。谢谢
$ scala
Welcome to Scala version 2.11.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_05).
Type in expressions to have them evaluated.
Type :help for more information.

scala> object Days extends Enumeration { val M,T,W,Th,F,Sa,S = Value }
defined object Days

scala> val ds = (2 to 5).toArray
ds: Array[Int] = Array(2, 3, 4, 5)

scala> Days.values filter (ds contains _.id)
res0: Days.ValueSet = Days.ValueSet(W, Th, F, Sa)
scala> Days.ValueSet.empty
res1: Days.ValueSet = Days.ValueSet()

scala> res1 + Days.T
res2: Days.ValueSet = Days.ValueSet(T)
scala> implicit val xxx = new collection.generic.CanBuildFrom[Array[Int], Days.Value, Days.ValueSet] {
     | def apply() = Days.ValueSet.newBuilder
     | def apply(from: Array[Int]) = apply()
     | }
xxx: scala.collection.generic.CanBuildFrom[Array[Int],Days.Value,Days.ValueSet] = $anon$1@6b474074

scala> (2 to 5) map (_ => Days.T)
res4: scala.collection.immutable.IndexedSeq[Days.Value] = Vector(T, T, T, T)

scala> (2 to 5) map (Days(_))
res5: scala.collection.immutable.IndexedSeq[Days.Value] = Vector(W, Th, F, Sa)