Scala模板限制

Scala模板限制,scala,templates,Scala,Templates,在Scala中,是否可以对模板化类型提供任意限制?在我正在处理的特定情况下,我有一个具有两个模板参数的类,如下所示: class TwoWayMap[S,T]( ) { ... } 我正试图在一对地图周围设计一个薄包装,允许用户在两个方向上查找密钥。将两种类型限制为不相同将允许基于类型查找值,从而允许我编写以下两种: def apply( t : T ) def apply( s : S ) 但是很明显,如果类型相同,这不起作用,所以我想限制S!=T由于Java类型的擦除,def a

在Scala中,是否可以对模板化类型提供任意限制?在我正在处理的特定情况下,我有一个具有两个模板参数的类,如下所示:

class TwoWayMap[S,T]( )
{
    ...
}
我正试图在一对地图周围设计一个薄包装,允许用户在两个方向上查找密钥。将两种类型限制为不相同将允许基于类型查找值,从而允许我编写以下两种:

def apply( t : T )
def apply( s : S )

但是很明显,如果类型相同,这不起作用,所以我想限制S!=T

由于Java类型的擦除,
def apply(T:T)
def apply(s:s)
将导致
def apply(…:Object)
,这将是不明确的


因此,即使您会发现
S!=这是不可能的。

除了Joa Ebert所写的:解决这一问题的一种可能方法是使用
类型:

class TwoWayMap[S,T] {
    def apply(k:Either[S,T]):Either[S,T] = k match {
        case Left(s) => Right(tForS(s))
        case Right(t) => Left(sForT(t))
    }
    // ...
}

也许这对你来说太繁琐了。

我认为如果你能提供这样做的动机会更好。我认为你做不到(一点也不确定)。我们通常只讨论泛型类型的上下限。在我看来,你想要的可能是通过更好的程序设计获得的。我已经改进了我的示例以显示动机!当然,您可以在运行时使用反射来实现这一点,但似乎您需要一个compiletime修复程序,对吗?当然,我想说的是,如果人们使用相同的类型,他们根本不知道自己在做什么,只需一个运行时异常就足够了。template这个词在Scala中有一个非常特殊的含义,而且你似乎没有谈论任何与之有着千丝万缕联系的东西。在我看来,您谈论的是参数多态性,即泛型,而不是模板。您确定要处理在使用方面不区分
S
t
的情况吗?不,绝对不是,这真的很好。谢谢