- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我刚刚遇到了短语“java subtype”和“true subtype”。它在一个问题中以一种明确表示它们不相同的方式给出。但我找不到关于两者之间区别的解释。
有人可以解释一下“java subtype”和“true subtype”之间的区别吗?
最佳答案
Java 子类型是扩展另一个类(甚至实现接口(interface))的任何类。真正的子类型不是特定于语言的东西:
真正的子类型总是可以替代父类(super class)型。“任何由父类(super class)型保证的属性必须由子类型保证(真正的子类型化)”
http://www.cs.washington.edu/education/courses/cse331/10au/lectures/subtypingexamples.pdf
该链接包含一个非常有启发性的示例。假设您有一个存储值 x 和 y 的 Point2D 类。您现在可以创建一个子类型 Point3D 并添加一个值 z。如果您不覆盖任何方法并注意您的 equals 和 hashcode 方法,您可以随时用 Point3D 实例替换 Point2D 实例。
这当然是一个简单的例子。有人可能会争论为什么不只有 Point3D。也许这些类都提供了一些方法,可以通过划分为类来更好地识别属于 2D 或 3D 领域。在这种情况下,它可能纯粹是一个设计决定。
class Point2D {
int x;
int y;
}
//true subtype
class Point3D extends Point2D {
int z;
}
如果您使用一个 Person 类然后有两个子类型:Employee 和 Customer,则可能会出现一个更复杂的示例。 Employee 和 Customer 都提供与 Person 相同的字段和方法。
class Person {
String name;
Date birthday;
@Override
public boolean equals(Object o){
//simplified equals implementation, this does not fulfill equals contract!
return name.equals(((Person)o).name);
}
}
//true subtype, same behaviour
class Employee extends Person {
long departmentId;
}
//not a true subtype, different behaviour -> equals
class Customer extends Person {
long customerId;
Date lastContact;
String city;
public boolean equals(Object o){
//simplified equals implementation, this does not fulfill equals contract!
return customerId.equals(((Customer)o).customerId);
}
}
在此示例中,Employee 将是 Person 的真正子类型。然而,Customer 不是真正的子类型,因为 equals 实现不同(并且可能 hashCode() 也是如此)并且它的行为不会相同并且可能无法始终替代 Person 对象。
关于java - "Java subtype"和 "true subtype"有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9151461/
我刚刚遇到了短语“java subtype”和“true subtype”。它在一个问题中以一种明确表示它们不相同的方式给出。但我找不到关于两者之间区别的解释。 有人可以解释一下“java subty
假设我有一个对象的实例,我知道它属于通过 C# 中父类(super class)型的引用传递给我的某个子类型的子类,我习惯于看到类型转换以类似 Java 的方式完成(假设“reference"属于父类
我有一个 VS 2008 C# Web 项目,每当我对其中的文件(甚至不是项目文件本身)进行一些更改时,VS 都会从 csproj 文件中删除如下一些行: ASPXCodeBehind 所以像这样:
有人见过这个吗?我有一个大型 Visual Studio 项目,它不断将 [Subtype]Designer[/Subtype] 添加到我的 .vcproj 中,然后在下一次打开和关闭项目时将其删除。
我从 the Flow docs 中窃取了一些 JSON 类型. 我输入了一个字符串数组 - 注释 Array - 到一个输出带有一些 JSON 的 promise 的函数 - 注释 Promise
我在 Kotlin 中遇到了函数参数问题。我将在一些代码的帮助下解释这个问题。 我创建了一个类层次结构。当我将子类型传递给需要父类型的函数时,没有问题。 open class A (val i: In
不清楚为什么我得到ERROR: LoadError: UndefVarError: subtypes not defined执行 .jl 文件时,而不是从 REPL 执行时。 例如。 abstract
我是 flutter 和 dart 的新手,并试图从 firestore 获取数据作为流并提供给我的 ListView 但我不断收到此错误: type 'MappedListIterable' is
我想要一个函数,它可以接受除某些特定类型之外的任何内容。粗略地说就像 function f(y::X) where y: ),但您不需要该运算符来解决您的问题。 如果您只想要一个适用于所有类型的通用方
我正在将一个旧的 Java 项目重写为 Go。 我已经在工作中完成了一些 Go,但我不知道如何将我的 OOP(带有抽象类等)转换为 Go 哲学。 在这个想法中,我有两种类型(很快就会有 3 种),它们
我想要一个函数,它可以接受除某些特定类型之外的任何内容。粗略地说就像 function f(y::X) where y: ),但您不需要该运算符来解决您的问题。 如果您只想要一个适用于所有类型的通用方
在学习 Swift 教程时遇到了一些麻烦... func exchange(inout data:[T], i:Int, j:Int) { let temp = data[i]; da
我正在通过阅读来学习 Typescript this official document关于索引器类型。 我无法理解这段代码: interface NumberDictionary { [in
NSEvent有一个方法来获取事件的子类型: Getting Custom Event Information – data1 – data2 – subtype 是否可以从 CGEvent 访问相同
在一些 PL/SQL 示例代码中,我注意到每次都使用 type 和 subtype 关键字来声明自定义类型(类似于 typedef例如,C 中的 关键字)。 在我看来,它们的用法是可以互换的:它们有什
在 Scala 中,为什么在方法类型参数上设置类型下限不会对方法参数强制执行“是父类(super class)型”限制? object TypeBounds extends App { class
我正在尝试创建一个应该返回子类型(InternalTask 和 ExternalTask 的列表)的查询。这很好用,但我想在其中一个子类型的查询中添加一个 where 子句。我尝试了以下方法:
是否可以以嵌套方式使用多个@JsonSubType注释? 例如,想象以下类: @Data @JsonSubTypeInfo(include=As.EXISTING_PROPERTY, property
假设我有以下数据库结构: 产品表中的product_id是自动递增的 如何在 Products 表以及 Amazon_Books 或 Starbucks_Products 中插入某些内容而不丢失对 P
我正在从 org.reflections:reflections:0.9.5 升级到版本 0.9.9。我正在使用: Reflections reflectionPaths = new Reflecti
我是一名优秀的程序员,十分优秀!