当前位置: 首页 > 知识库问答 >
问题:

锈蚀是否具有所有实体“继承”或实现的类型或特征?

谢飞舟
2023-03-14

在Java中,所有对象都继承自Java。lang.Object。在Go中,所有类型/结构都实现空接口interface{}。Rust语言中是否有类似的构造?

如果答案是否定的,是什么让它变得不必要?这是因为Rust中的所有实体(模块除外)都可以按类型参数化吗?这是否消除了所有Rust实体/结构/枚举共享的公共“超类型”或公共特性的需要?

共有2个答案

郏经纬
2023-03-14

按照我的理解,如果不是完全不必要的话,在生锈的情况下,有一个基本类型是不必要的。

请注意,参数多态性(泛型)的引入也删除了java中对象的大多数用例。使用Object可以实现一个“通用”方法,该方法可以处理任何类型的java类型。另一方面,当你有一个对象时,你不能用它做很多事情。。。您必须将其转换回实际的子类型才能使用它。

例如,旧的非通用版本的java集合与Objects一起工作,这意味着你必须这样工作(示例直接来自Oracle网站上的这篇文章):

LinkedList list = new LinkedList();
list.add(new Integer(1));
Integer num = (Integer) list.get(0);

add获取一个对象(因此您可以将集合用于任何类型)。但是get也会返回一个对象,因此您必须根据您(程序员)对最初插入到LinkedList中的内容的了解,将其转换回Integer。这里的类型安全性很低。

自java 1.5以来,同一容器的新通用版本为:

LinkedList<Integer> list = new LinkedList<Integer>();
list.add(new Integer(1));
Integer num = list.get(0);

现在您有了一个Integer列表,因此add接受Integerget返回Integer<代码>对象再也看不到了(尽管由于类型擦除,它就在那里,几乎没有隐藏在引擎盖下…)

请注意,Go对接口{}的主要使用源于Go没有泛型的事实。使用接口{}的主要模式大致相同。当你必须处理多个类型时,你可以使用它,在使用它之前,你可以把它(尽管是以一种更安全的方式和更优雅的模式)转换回一个更有用的类型。

考虑到这一点,理论上您可以以相同的方式在Rust中使用any(在使用之前检查实际类型并对其进行转换)。只是你可能不会发现很多情况下这可能是有用的。下面的代码适用于rustc 0.13-每晚(2015-01-01),尽管我相信有更好的方法来编写它...

use std::any::{Any, AnyRefExt};

// just a couple of random types
struct Foo {
    a: f64
}

enum Bar {
    Baz(int),
    Qux
}

fn main() {
    // create an array of things that could have any type
    let anything = &[&1i as &Any, &Foo{a: 2.} as &Any, &Bar::Qux as &Any];

    // iterate and print only the integer
    for &any in anything.iter() {
        if any.is::<int>() { // check if type is int
            match any.downcast_ref::<int>() { // cast to int
                Some(a) => { println!("{}", *a); }
                None => panic!()
            }
            // or just (shorter version of the match)
            println!("{}", *any.downcast_ref::<int>().unwrap());
        }
    }
}
傅茂实
2023-03-14

是的,有一种特质。它是std::any::Any

从文档中:

任意特征由所有静态类型实现,并可用于动态类型

 类似资料:
  • 我对平台API有问题(https://api-platform.com/)当我有一个从另一个实体继承的实体时。例如,从User实体继承的Worker实体。当我转到Platform API文档时,所有Worker属性都显示在User类中 这是一个比解释更好的模式。这是我的两个实体和问题文档的结果 这就是问题所在。我们看到 Worker 子类的属性出现在 User 类的模型中。并且当我测试发送 POS

  • 我在两个实体之间有双向或父/子关系: 我要选择没有的所有或的属性设置为的。 我使用的是。

  • 假设我有一个 我可以为任何我可能想要的结构实现,例如: 现在,我想自动我的特征,无论元组是由所有实现特征的类型组成的。直觉上,所有快乐的元组也是快乐的。 有可能做这样的事吗?例如,我可以简单地将的实现扩展到两种类型的任意元组: 因此,这可以完美地编译: 但是我怎么能把它推广到任何长度的元组呢?就我的理解而言,我们在Rust中没有变异的泛型。有变通办法吗?

  • 问题内容: 我有一个实体类和一个基于该实体的子类: 和 我需要发出仅在基类(A)上使用存储过程的本机查询。如果我尝试如下: 我收到有关“在ResultSet中未找到clazz_列”的错误。我假设JPA提供程序添加了此列,以便区分基类和扩展类。我可以通过显式添加clazz列和子类中的所有字段来解决此问题: 其中“ prop1”和“ prop2”是子类B的属性。但是,这似乎是不必要的修改,并且如果子类

  • 如何使用NamedQuery在jointable上查找实体?我有一个抽象的父类/实体,带有@heritance(strategy=InheritanceType.JOINED)和两个子类/子实体。因此,在数据库中我有一个父表(SDR)和两个子表(xSdrs和ySdrs)。还有另一个表保留,它与表SDR有多对多关系。这就是为什么我在保留和特别提款权之间创建了一个连接表 我打算在父实体Sdr中使用Na

  • 以此作为我的基点:https://vladmihalcea.com/the-best-way-to-map-a-many-to-many-association-with-extra-columns-when-using-jpa-and-hibernate/ 我有一个名为 Attendance 的实体,它有一个 emebedid AttendacneId,它有两列 lectureId (strin