在编写代码时,什么时候应该选择关联类型而不是泛型类型参数,什么时候应该做相反的操作?
这在Rust编程语言的第二版中有所涉及。不过,让我们再深入一点。
让我们从一个更简单的例子开始。
什么时候使用一种特质方法是合适的?
trait MyTrait {
fn hello_word(&self) -> String;
}
struct MyTrait<T> {
t: T,
hello_world: fn(&T) -> String,
}
impl<T> MyTrait<T> {
fn new(t: T, hello_world: fn(&T) -> String) -> MyTrait<T>;
fn hello_world(&self) -> String {
(self.hello_world)(self.t)
}
}
trait MyTrait {
type Return;
fn hello_world(&self) -> Self::Return;
}
trait MyTrait<Return> {
fn hello_world(&Self) -> Return;
}
哪种形式更合适取决于强制唯一性是否有意义。例如:
deref
使用关联的类型,因为如果没有唯一性,编译器将在推理过程中发疯add
使用关联类型,因为它的作者认为给定两个参数,就会有一个逻辑返回类型正如您所看到的,虽然deref
是一个明显的用法(技术约束),但add
的情况就不那么清晰了:根据上下文的不同,i32+i32
产生i32
或complex
可能是有意义的?尽管如此,作者还是行使了他们的判断,并决定没有必要重载用于添加的返回类型。
这个问题是在泛型关联类型在Rust中可用之前提出的,尽管它们是被提出和开发的。 我的理解是,特征泛型和关联类型在它们可以绑定到结构的类型数量上有所不同。 关联类型仅绑定1个类型: 泛型关联类型是这两种类型的混合。它们绑定到一个类型,正好有一个关联的生成器,而生成器又可以关联任何数量的类型。那么前面示例中的和这个泛型关联类型有什么区别呢?
问题内容: 在Java中,我编写了一个Binary Search Tree类,该类使用递归添加节点。现在,我想使用泛型对其进行概括,以便我可以了解更多有关它们的信息。 我添加节点的功能在以下类中 主类具有以下代码来开始工作。我正在使用字符串,但是数据类型可能是一些复杂的类型。 我开始使用Comparable接口,但是如何编写CompareTo()函数?我不知道T是什么类型的?我得到的错误是“运算符
问题内容: 何时使用泛型会引起一些混乱。我看过Java泛型?但仍然有一些问题。 说我有: 我应该使用: 要么 还是取决于执行的任务? 是泛型的,仅用于聚合关系(容器等);也就是说,它们只是用于收藏吗? 问题答案: 人们通常不会使用汽车类型来参数化。他们的车只定义了非常烦人的人。人们也及时换车。因此,即使仅出于语义考虑,我也不会参数化类。 在深入了解此类编程细节之前,请考虑一下您想从现实世界中模仿的
问题内容: 在解决了之前的问题的基础上,但又导致了另一个问题。如果协议/类类型存储在集合中,则取回并实例化它们会引发错误。下面是一个假设的例子。该范例基于“程序到接口而不是实现”,“程序到接口” 编辑 -我当前的解决方法是遍历集合,但是由于api必须知道各种实现,所以这当然是有限的。另一个限制是这些类型的子类(例如PersianCat,GermanShepherd)将不会调用其重写的函数,否则我将
我是Spring的新手,我正在尝试自动连接一个通用DAO。不幸的是,我遇到了一个错误。我试图根据它搜索信息,但大多数解决方案都声明使用@Qualifier注释,我认为这与我想要实现的目标背道而驰。 所以下面的一些代码(我将摆脱类参数,一旦我处理当前问题): 道 服务 和下面抛出的错误:
类型和泛型 类型系统的首要目的是检测程序错误。类型系统有效的提供了一个静态检测的有限形式,允许我们代码中明确某种类型的变量并且编译器可以验证。类型系统当然也提供了其他好处,但错误检测是他存在的理由(Raison d’Être) 我们使用类型系统应当反映这一目标,但我们必须考虑到读者(译注:读你代码的人):明智地使用类型可以增加清晰度,而过份聪明只会迷乱。 Scala的强大类型系统是学术探索和实践共