Scala中有多个下型边界

问题描述

| 我注意到
tuple.productIterator
总是返回
Iterator[Any]
,想知道是否不可能设置多个下限(因此它可能是最低普通超类型的Iterator)。 我尝试并搜索了一下,但只发现了多个上限的问题。 这是我关于如何定义迭代器类型的测试:
def f[A,B](a:A,b:B) = List(a,b)
// return type is List[Any]

def f[A,B,T >: A \"and\" T >: B](a:A,b:B) = List[T](a,b)
// doesn\'t compile,but
//  f(1,true) should give a List[AnyVal] and
//  f(\"x\",\"y\") a List[String]
这是JVM的限制吗? 编辑: 这是一个稍大的示例,当应该在方法中定义T时,使用IttayD方法似乎无法解决:
class Foo[A,B](a: A,b: B) {
  def f[T >: A] = List[T](a) // works
  def g[T >: A \"and\" T >: B] = List[T](a) // doesn\'t work
}
    

解决方法

对于
A
B
与compiler6ѭ同时被编译器绑定的简单情况,IttayD \的答案很好用:
def f[T,A <: T,B <: T](a:A,b:B) = List[T](a,b)
class Foo[A,B]
示例中已绑定
A
B
时,您需要引入临时哑变量以使编译器执行此工作:
class Foo[A,B](a: A,b: B) {
  def g[T,A1 >: A <: T,B1 >: B <: T] = List[T](a: A1,b: B1)
}
(为清楚起见:
A1 >: A <: T
表示类型
A1
必须是
A
的超类型和
T
的子类型,而不是
A
A1
T
的子类型。) 13ѭ和
B1
仅用于推断of6ѭ的正确类型。如果编译器必须推断它们,它们将解析为
A1 = A
B1 = B
,然后是
T
作为最具体的类型,它是
A
B
的超类。 但是,编译器没有意识到的一件事是,通过传递性,我们同时拥有
T >: A
T >: B
,这直接源自对
A1
B1
的约束。我们需要提供类型归因的帮助。 现在,
Product#productIterator
无法使用此技术,因为它是在我们甚至都不知道
A
B
的地方定义的,或者在具体子类中确实有多少个类型参数的地方定义了。     ,听起来您需要的是一个HList:http://apocalisp.wordpress.com/2010/07/06/type-level-programming-in-scala-part-6a-heterogeneous-list%C2%A0basics/ 要回答特定问题:
scala> def f[T,b)
f: [T,B <: T](a: A,b: B)List[T]

scala> f(1,true)
res0: List[AnyVal] = List(1,true)

scala> f(\"x\",\"y\")
res1: List[java.lang.String] = List(x,y)
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...