Scala:两个相等类型之间的类型方差和模式匹配

发布于 2024-08-30 02:08:35 字数 590 浏览 6 评论 0原文

前几天我正在玩一个类来处理一些算术运算(是的,我知道数字将在 2.8 中出现),并发现自己想知道如何简化以下内容:

def Foo[A]( _1:A, _2:A ) = (_1, _2) match{
    case _1:Bar, _2:Bar => _1 + _2
    case _1:Baff, _2:Baff => _1 push _2
    case _, _ => None
}

这样我就可以做

def Foo[A]( _1:A, _2:A ) = _1 match{
    case _1:Bar => _1 + _2
    case _1:Baff => _1 push _2
    case _ => None
}

当然,我知道在按照声明方式声明函数,_2 的类型可以继承自 _1 的类型,“A”可以是共享特征,等等。我知道这意味着编译器需要抗议以保护代码。有没有办法说“我希望 _1 和 _2 是同一个 extact 类”,这样我就不必进行双重 _1:Int, _2:int 声明?

I was playing around the other day with making a class to handle some arithmetic operations (yes, I know numeric is coming out in 2.8) and found myself wondering how to simplify the following:

def Foo[A]( _1:A, _2:A ) = (_1, _2) match{
    case _1:Bar, _2:Bar => _1 + _2
    case _1:Baff, _2:Baff => _1 push _2
    case _, _ => None
}

so that I can do just

def Foo[A]( _1:A, _2:A ) = _1 match{
    case _1:Bar => _1 + _2
    case _1:Baff => _1 push _2
    case _ => None
}

Granted, I know that in declaring the function the way it's been declared that _2's type could conceivably inherit from _1's type, "A" could be a shared trait, or so on. I know this means the compiler needs to protest to protect the code. Is there a way to say "I want _1 and _2 to be the same extact class" so that I don't have to make the double _1:Int, _2:int declaration?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

錯遇了你 2024-09-06 02:08:35

我会在这里使用重载。

I'd use overloading here instead.

若相惜即相离 2024-09-06 02:08:35

也许我误解了你的意思,但如果你只是希望两个参数必须是相同的类型,你可以执行如下操作:

def Foo[A,B >: A <: A](_1: A, _2:B) = ...

这指定 B 都是由 B 限制的下限和上限类型code>A,因此必须是 A。因此,仅当 _1_2 类型相同时才会编译。

Perhaps Im misunderstanding you, but if you just want the two parameters to be required to be the same type, you can do something like the following:

def Foo[A,B >: A <: A](_1: A, _2:B) = ...

This specifies that B is both lower and upper type bounded by A, thus must be A. Thus it will only compile if _1 and _2 are of the same type.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文