我试图找出一种机制,在Java中实现如下内容。本质上,我想使用泛型类的参数作为泛型类:
class A<T> { T<String> aString; }
在Java中,我可以把参数传递给类型构造函数,作为参数接收,这是可能的吗?是否可以指出T具有* -> *类型,或者它是某种类型的构造函数?如果没有,换一种语言怎么样?
T
* -> *
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。
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。
HashMap
extends A[HashMap]
A[T[_]]
String
2条答案
按热度按时间qq24tv8q1#
我不了解Java(但this question可能与您有关),但您可以在Scala中实现这一点
然后你可以像这样示例化类,依赖于类型推断:
你可以使用这个代码here on Scastie。
qvsjd97n2#
这被称为higher-kinded type。这里有一个Scala中的例子,它正是你想要的(Scastie):
请注意,在
HashMap
示例中,不可能使用extends A[HashMap]
,因为HashMap
需要两个类型参数,而A[T[_]]
只接受带单个参数的类型。为了解决这个问题,声明了一个type alias,它接受一个map值的类型参数,并将键类型硬编码为String
。