scala Java中的泛型参数

qgelzfjb  于 2023-05-17  发布在  Scala
关注(0)|答案(2)|浏览(167)

我试图找出一种机制,在Java中实现如下内容。本质上,我想使用泛型类的参数作为泛型类:

class A<T> {
  T<String> aString;
}

在Java中,我可以把参数传递给类型构造函数,作为参数接收,这是可能的吗?是否可以指出T具有* -> *类型,或者它是某种类型的构造函数?如果没有,换一种语言怎么样?

qq24tv8q

qq24tv8q1#

我不了解Java(但this question可能与您有关),但您可以在Scala中实现这一点

final case class A[T[_], B](a: T[B])

然后你可以像这样示例化类,依赖于类型推断:

val a1 = A(List("hello", "world"))
val a2 = A(Some(42))

你可以使用这个代码here on Scastie

qvsjd97n

qvsjd97n2#

这被称为higher-kinded type。这里有一个Scala中的例子,它正是你想要的(Scastie):

import scala.collection.mutable.HashMap
trait A[T[_]] {
  def aString: T[String]
}

class AVector extends A[Vector] {
  def aString: Vector[String] = Vector("Hello, world!")
}

type StringKeyedHashMap[T] = HashMap[String, T]
class AHashMap[T] extends A[StringKeyedHashMap] {
  def aString: HashMap[String, String] = HashMap(
    "Hello, world!" -> "Goodbye, world!"
  )
}

println((new AVector).aString)  // Vector(Hello, world!)
println((new AHashMap).aString) // HashMap(Hello, world! -> Goodbye, world!)

请注意,在HashMap示例中,不可能使用extends A[HashMap],因为HashMap需要两个类型参数,而A[T[_]]只接受带单个参数的类型。为了解决这个问题,声明了一个type alias,它接受一个map值的类型参数,并将键类型硬编码为String

相关问题