问题标签 [scala-generics]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
75 浏览

scala - 函数返回值中的 Scala 泛型

我已经定义了这些类。

这不会编译。它给出错误“必需的 T,但发现 PostResult(或 PostError)”。

0 投票
2 回答
1104 浏览

scala - 如何“提取”类型参数以实例化另一个类

以下 Scala 代码有效:

我的问题是我想像这样实例化ReducerComponent

甚至更好:

这意味着很多事情:

  1. 我想对类型进行类型MapOutput检查KeyVal[K, C]
  2. 我想检查C是否与 中使用的类型相同f
  3. 我还需要“提取”K以便memapply.

要问的很多吗?:) 我想写类似的东西

到我将实例化的时候,ReducerComponent我所拥有的只是fand MapOutput,所以推断 V 是可以的。但是我只有KeyVal[K,V]一个类的类型参数,它可以不同于KeyVal[_,_].

我知道如果您了解类型推断的工作原理,我的要求可能很疯狂,但我不知道!而且我什至不知道什么是继续的好方法——除了在我的高级代码中一直进行显式类型声明。我应该改变所有的架构吗?

0 投票
2 回答
70 浏览

scala - 为 Try[T] 做一个方便的日志功能,但是因为类型系统而卡住了

我想知道这是否可以使用 Scala 的类型系统来完成。

基本上,我想创建一个接受 aresult类型Try[T]并打印出一条消息的日志记录方法,该消息取决于result是 aSuccess还是 aFailure

例如,签名可能看起来像

并且可以这样使用:

这将输出

size is 13 kb如果sizeSuccess(x: Int),例如,Success(13)

或者

error: size is (not available)如果size如果类型Failure(t: Throwable)

棘手的部分是,如果它是 a ,我们需要能够访问Try用于打印到屏幕的对象,或者如果它是 a作为占位符Success,则打印选择的默认字符串(例如“(不可用)”) 。Failure此外,它必须使用非常通用的类型,T或者Any范围可以从简单的标量值到类的实例等。

这个古怪函数的用例是,它可以非常方便地以一种信息丰富的方式记录 Try 对象,而不会用 map/recover 或 match 语句使代码混乱。

这是我想出的骨架,当然最难的部分还没有弄清楚。

0 投票
2 回答
238 浏览

scala - Scala 通用函数...在函数中使用 T

我有点困惑为什么下面的代码不起作用:

该函数将按如下方式调用:

我收到以下错误:

我对 Scala 泛型相当陌生......有什么办法可以做我想做的事情吗?

0 投票
2 回答
628 浏览

scala - Scala 泛型 - 为什么 scala 在使用类型约束时返回超类型的实例而不是子类型?

我正在尝试将 y 转换为可以附加到 x 的东西,其中 x 是某种序列。

我有以下解决方案:

但我怀疑为什么原来的那个不起作用。看起来如果我应用:+在超类中定义的运算符(在这种情况下)然后它返回超类?即 ifU是 a Vectorfoo返回Seq,所以我得到错误required "U" but found "Seq[T]"

谁能启发我为什么会看到这种行为?

0 投票
1 回答
387 浏览

scala - 将 scalatest 与 mockito 一起使用时,scalatest 会抛出奇怪的异常

我需要有关 scalatest 和 mockito 的帮助。我想用泛型为一个简单的方法编写测试:

我的测试课:

当我运行测试时,它会引发以下异常:

那么,如果我的方法只有 3 个参数,为什么它会询问 4 个匹配器?是因为通用吗?

版本:

  • 斯卡拉 2.11.7
  • scalatest 2.2.4
  • 模拟 1.10.19
0 投票
1 回答
159 浏览

scala - 编写一些通用 scala 集合的函数

我已经定义了一个案例类...

...这将作为 Akka Actors 之间的消息传递。接收器将使用 过滤一些类型A的集合,descriptor然后使用 . 从生成的过滤集合中选择单个元素selector

如所写,它仅在接收参与者的集合具有 type 时才有效immutable.Seq[A]。我想概括以上内容,以便它可以与 type 元素的通用集合一起使用A。这可能吗?

0 投票
0 回答
137 浏览

scala - Scala:类型擦除不利地扩大了案例的界限

更新

这个问题是关于用AnyinA替换的step(x.flatMap((a: Any) => f(a).flatMap(g)))。模式匹配中的类型擦除似乎使这变得困难。

我很欣赏评论中的观点,即 Free monad 与问题的症结无关。我需要的示例包括泛型类型A和泛型类型F[_](更高种类的类型?)。

这是一个迂腐的问题,我很想知道“如何绕过类型擦除”(如何在 Scala 上绕过类型擦除?或者,为什么我不能获得我的集合的类型参数?),即使代码编译。我自己不知道如何将 TypeTags 应用于此。

静态类型检查的提及很有用。有人会解释为什么Any设置为A静态类型检查而不是动态类型检查吗?我相信类型擦除使静态类型检查在这里变得不可能,并且编译器正在退回到动态类型检查以解析AnyA. 谢谢


我有三个案例类,

从 trait 继承Free

step,以及上面的类,是“Scala 中的函数式编程”第 13 章中用于实现蹦床的练习的一部分。

因为类型擦除不鼓励case FlatMap(FlatMap(x, f), g)Any. 然后,给定的匿名函数的所需签名x.flatMap变为Any=>Free[F,A]。我希望这个函数所需的签名是A=>Free[F,A]——运行时的真正签名。

注释给flatMapas的匿名函数的输入类型A会使编译失败,

我明白这是因为A它只是以下的一个子集Any

Any类型擦除使我无法缩小范围A

以这种方式注释case语句除了文档之外没有其他用途,甚至会导致问题,写在这里:Scala: type annotations make tail recursion check fail

我不知道如何将 TypeTags 应用于这种情况。

我怎样才能注释这个语句来case打倒?谢谢!!AnyA

0 投票
1 回答
640 浏览

scala - Scala 和 Java 泛型 - 类型不匹配错误

有一个带有这个签名的方法:

在 Scala 中,我使用了这样的方法:

并编写了一个函数来过滤掉所有带有这个签名的锚标签:

但我收到一条错误消息,内容如下:

有人可以为我解释一种方法来声明我的函数,该函数允许我实际传入的类型,这有点令人困惑。

0 投票
1 回答
46 浏览

scala - 反思类型成员?

我知道这是可能的:

但是,现在我想做A一个抽象类型:

如何实现该isDouble功能?