Java 数组映射()期间令人费解的隐式转换
我有一个用例,我得到一个包装类的Java数组,例如包装一个int,我想将它们转换为相同数据的值集,但是我遇到了一个令人困惑的隐式转换问题。下面是我正在尝试的Java和Scala示例: …/java/demoapi/SomeWrapper.java …/scala/demo.scala 映射无法编译,出现以下错误: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 =>
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)