Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法从Scala中的映射中获取键/值类型? 在C++中,我们可以从定义的映射中获得抽象的键值类型( Kype类型< /COD>, ValueSype类型< /代码>)。当我以后需要更改映射类型时,这非常方便,因为依赖类型会相应地更改_Scala_Types - Fatal编程技术网

有没有办法从Scala中的映射中获取键/值类型? 在C++中,我们可以从定义的映射中获得抽象的键值类型( Kype类型< /COD>, ValueSype类型< /代码>)。当我以后需要更改映射类型时,这非常方便,因为依赖类型会相应地更改

有没有办法从Scala中的映射中获取键/值类型? 在C++中,我们可以从定义的映射中获得抽象的键值类型( Kype类型< /COD>, ValueSype类型< /代码>)。当我以后需要更改映射类型时,这非常方便,因为依赖类型会相应地更改,scala,types,Scala,Types,在Scala中,我也在寻找这样的特性。例如,我定义了一个贴图类型: type MapTy : mutable.Map[Long, Int] 我希望返回一个map条目(其类型为Long->Int)。返回类型取决于MapTy,最好在函数签名中显式指定,编写方式类似于MapTy::key\u type->MapTy::value\u type。因此,当稍后我将MapTy更改为 type MapTy : mutable.Map[Int, Int] 条目类型也将同时更改为Int->Int 在Scala

在Scala中,我也在寻找这样的特性。例如,我定义了一个贴图类型:

type MapTy : mutable.Map[Long, Int]
我希望返回一个map条目(其类型为
Long->Int
)。返回类型取决于
MapTy
,最好在函数签名中显式指定,编写方式类似于
MapTy::key\u type->MapTy::value\u type
。因此,当稍后我将
MapTy
更改为

type MapTy : mutable.Map[Int, Int]
条目类型也将同时更改为
Int->Int


在Scala中可能吗?

在Scala中,泛型类型在擦除中丢失,因此在运行时不可能。有人可能会演示如何实现这一点,在此之前,这里有一个解决方法:

type Key = Int
type Value = Long
type Map = mutable.Map[Key, Value]

此外,这可能会有所帮助。

在Scala中,完全可以使用类型成员和类型细化来执行此类操作:

scala> case class WrappedMap[K, V](underlying: Map[K, V]) { type E = (K, V) }
defined class WrappedMap

scala> type MapTy = WrappedMap[Long, Int]
defined type alias MapTy

scala> val entry: MapTy#E = 1L -> 0
entry: (Long, Int) = (1,0)

scala> val entry: MapTy#E = 1L -> "foo"
<console>:14: error: type mismatch;
 found   : String("foo")
 required: Int
       val entry: MapTy#E = 1L -> "foo"
                                  ^

大多数情况下,标准集合库不包含表示元素类型的类型成员,部分原因是一般使用类型参数更适合惯用的Scala开发实践,但在某些情况下,类型成员很有用,如果你真的想在C++中描述你所描述的,那可能就是其中之一。

你能编写演示你的用例的示例代码吗?即使它不能编译。抱歉,但我不清楚类型擦除与这种情况有什么关系。你能扩展这一部分吗?我必须说我不是自我声明类型的专家,但我认为它们和其他类型一样工作。所以在擦除之后,在运行时,映射的类型只是
mutable.map
,所有关于键和值类型的信息都丢失了。这就是为什么您所问的在运行时是不可能的。在编译时,这可能是可能的,但我不知道如何做到这一点(但scala每天都让我惊讶,所以不要认为这是不可能的)。
def entries(m: MapTy): List[MapTy#E] = m.underlying.toList

val myEntries: List[MapTy#E] = entries(WrappedMap(Map(1L -> 0)))