Java Scala:函数有接口的返回类型,我需要实现类

Java Scala:函数有接口的返回类型,我需要实现类,java,scala,collections,Java,Scala,Collections,我需要使用一个返回类型为java.util.Collection的函数。我知道对于我的用例,这个函数总是返回一个ArrayList(它实现了集合)。 我试图写一份声明,如: val secMasterPrimaryRic:util.ArrayList[JsonNode]=返回集合()的函数 但我得到了一个错误: 错误:(88,87)类型不匹配; 找到:java.util.Collection[org.codehaus.jackson.JsonNode] 必需:java.util.ArrayLis

我需要使用一个返回类型为java.util.Collection的函数。我知道对于我的用例,这个函数总是返回一个ArrayList(它实现了集合)。 我试图写一份声明,如:

val secMasterPrimaryRic:util.ArrayList[JsonNode]=返回集合()的函数

但我得到了一个错误:

错误:(88,87)类型不匹配;
找到:java.util.Collection[org.codehaus.jackson.JsonNode]
必需:java.util.ArrayList[org.codehaus.jackson.JsonNode]


在Java中,我可能能够直接转换它。我正试图避免使用
代替
,因为有人告诉我这相当慢。有没有其他方法可以获得ArrayList

一般来说,将
Collection
转换为
ArrayList
是错误的,因为
Collection
可以有任何实现

我建议两种选择

  • 更改返回集合的
    函数的签名,使其返回
    ArrayList
  • 或者从
    集合创建新的
    ArrayList

    val secMasterPrimaryRic:util.ArrayList[JsonNode]=new util.ArrayList[JsonNode](functionThatReturnsCollection())


一般来说,将
集合
转换为
阵列列表
是错误的,因为
集合
可以有任何实现

我建议两种选择

  • 更改返回集合的
    函数的签名,使其返回
    ArrayList
  • 或者从
    集合创建新的
    ArrayList

    val secMasterPrimaryRic:util.ArrayList[JsonNode]=new util.ArrayList[JsonNode](functionThatReturnsCollection())


如果您有一个返回类型
X
的函数,但需要一个类型
Y
,其中
Y
具有“是”关系,则可以执行以下操作:

val myValue: TypeIWant = myFunction() match{
  case x: TypeIWant => x
  case y => convertToTypeIWant(y)
}

这样,您就可以尊重底层类型和任何需要转换的实现,而不必使用不安全的强制转换。

如果您有一个返回类型
X
的函数,但需要类型
Y
,其中
Y
具有“is a”关系,则可以执行以下操作:

val myValue: TypeIWant = myFunction() match{
  case x: TypeIWant => x
  case y => convertToTypeIWant(y)
}

这样,您就可以尊重底层类型和任何需要转换的实现,而不必使用不安全的强制转换。

这是否比
val secMasterPrimaryRic:util.ArrayList[JsonNode]=functionthattreturnscolection())。安装[util.ArrayList[JsonNode]]
更好
asInstanceOf
是不安全的操作,可能在运行时引发异常。这是否比val secMasterPrimaryRic:util.ArrayList[JsonNode]=返回集合()的函数好。asInstanceOf[util.ArrayList[JsonNode]
?是的,它更好
asInstanceOf
是一种不安全的操作,在运行时可能引发异常。
asInstanceOf
正是在Scala中编写强制转换的方式,因此它并不比Java慢。应该避免它,原因与避免Java中的强制转换完全相同,除了1)这在Scala文化中更根深蒂固;2) 首先检查
instanceof
然后强制转换到类型的习惯用法被模式匹配所取代。
asInstanceOf
就是在Scala中编写强制转换的方式,因此它并不比Java慢。应该避免它,原因与避免Java中的强制转换完全相同,除了1)这在Scala文化中更根深蒂固;2) 模式匹配取代了先检查
instanceof
然后强制转换为类型的习惯用法。