JAVA list中如何将类型为子类的list引用赋值给类型为父类的list引用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA list中如何将类型为子类的list引用赋值给类型为父类的list引用?相关的知识,希望对你有一定的参考价值。

Animal是Dog父类,我想把dog赋值给animal,请问有办法吗?
我的想法是list dog的引用赋值给list animal的引用,语法上应该怎么写?

List<Animal>和List<Dog>不是一个类型,也不是继承关系。
这里的泛型应该写作
List<? extends Animal> list = new ArrayList<Dog> ();追问

那还有一个继承自animal的cat,我Cat cat = new cat();
想上面写了后list.add(cat)?可以吗?为什么呢?谢谢!!!

参考技术A 可以强制转换,但是会出问题,编译的时候没问题,但是使用的时候,会出问题 参考技术B 强制转换就行了(List<Animal>)dog

如何将 scala.List 转换为 java.util.List?

【中文标题】如何将 scala.List 转换为 java.util.List?【英文标题】:How to convert a scala.List to a java.util.List? 【发布时间】:2011-01-26 15:52:02 【问题描述】:

如何将Scala的scala.List转换成Java的java.util.List

【问题讨论】:

老兄...更改接受的答案...(请) 【参考方案1】:

不知道为什么之前没有提到这一点,但我认为最直观的方法是直接在 Scala 列表中调用 JavaConverters 的 asJava 装饰器方法:

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]

【讨论】:

它还要求你是明确的,而不是依赖于一些可能在一段时间内不需要的隐含魔法。 如果序列化列表以供后续在 Java 代码中使用,这会导致问题......它会导致 ClassNotFoundException: scala.collection.convert.Wrappers。 Arrays.asList(foo : _*) 在这种情况下有效。 每次需要在Scala中使用Java的时候都会来这个页面。不幸的是,没有办法建议我为“.asJava”((【参考方案2】:

Scala List 和 Java List 是两种不同的野兽,因为前者是不可变的,而后者是可变的。因此,要从一个到另一个,首先必须将 Scala List 转换为可变集合。

在 Scala 2.7 上:

import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))

从 Scala 2.8 开始:

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
asList(ListBuffer(List(1,2,3): _*))
val x: java.util.List[Int] = ListBuffer(List(1,2,3): _*)

但是,如果预期的类型是 Java List,则该示例中的 asList 不是必需的,因为转换是隐式的,如最后一行所示。

【讨论】:

val x: java.util.List[Int] 仍然是不可变的。只需在 Java 中尝试 x.add(something) ——它会抛出错误 @Vitamon 它不会对我抛出任何错误——我只是对其进行了测试以确认。 从 2.12 开始不推荐使用 scala.collection.JavaConverters 对于 2.12.1,当立即使用 Scala for 循环遍历 Java 列表时,我在 JavaConverters 包中使用 asScalaBuffer() 时运气更好:scala-lang.org/api/2.12.1/scala/collection/JavaConverters$.html【参考方案3】:

总结前面的答案

假设我们有以下List

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

如果您想明确准确说明您要转换的内容:

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]

如果您不想要协同控制转换并让编译器让隐式为您工作:

scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._

scala> val javaList: java.util.List[Int] = scalaList
javaList: java.util.List[Int] = [1, 2, 3]

如何控制代码由您决定。

【讨论】:

【参考方案4】:

Scala 2.13 开始,包scala.jdk.CollectionConverters 通过Seq 的皮条客提供asJava 并替换包scala.collection.JavaConverters/JavaConversions

import scala.jdk.CollectionConverters._

// val scalaList: List[Int] = List(1, 2, 3)
scalaList.asJava
// java.util.List[Int] = [1, 2, 3]

【讨论】:

【参考方案5】:

相当老的问题,虽然我会回答,但大多数建议已被弃用。

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)

【讨论】:

object JavaConversions in package collection is deprecated (since 2.12.0): use JavaConverters【参考方案6】:

更新

使用 Scala 2.9.2:

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
val x: java.util.List[Int] = ListBuffer( List( 1, 2, 3 ): _* )

结果

[1, 2, 3]

【讨论】:

【参考方案7】:

对于单次调用,手工操作可能是最简单的解决方案:

val slist = List (1, 2, 3, 4)          
val jl = new java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))   

我没有衡量性能。

【讨论】:

【参考方案8】:

即使在 Java 端,只要按照上面的建议进行操作就会产生不可变列表。 我发现的唯一可行的解​​决方案是:

def toJList[T](l:List[T]):util.List[T] = 
  val a = new util.ArrayList[T]
  l.map(a.add(_))
  a
 

【讨论】:

【参考方案9】:

自 Scala 2.12.0 JavaConversions has been deprecated.

所以对我来说最简单的解决方案是:

java.util.Arrays.asList("a","b","c")

【讨论】:

这个答案没有解释如何使用它来将 scala 列表转换为 java 列表。 Arrays.asList 也可能有问题,因为它返回的 Arrays.ArrayList 不是可调整大小的 List,如果您认为自己有 util.ArrayList,可能会导致一些意外错误。 弃用是真的,2.12.4有import scala.collection.JavaConverters._

以上是关于JAVA list中如何将类型为子类的list引用赋值给类型为父类的list引用?的主要内容,如果未能解决你的问题,请参考以下文章

java常用工具集合

无法处理托管/反向引用“defaultReference”:反向引用类型 (java.util.List) 与托管类型不兼容

java如何将json的数据转换为map或者list类型的?

java 反射 , 判断Class是否是某个类的子类或父类

java泛型通配符的问题

java怎么将list引用转为值