“与”的区别是什么;“Java子类型”;及;“真实子类型”;

“与”的区别是什么;“Java子类型”;及;“真实子类型”;,java,subtype,Java,Subtype,我刚才遇到了短语“java子类型”和“true子类型”。这是在一个问题中以一种明确的方式给出的,它们是不同的。但是我找不到解释这两者之间的区别 有人能解释一下“java子类型”和“true子类型”之间的区别吗?java子类型是扩展另一个类(甚至实现接口)的任何类。真正的子类型不是特定于语言的: 真正的子类型始终可以替换超类型。 “由超类型保证的任何属性必须由子类型保证(真正的子类型)” 这个链接包含了一个非常有启发性的例子。假设您有一个存储值x和y的类Point2D。现在可以创建子类型Poin

我刚才遇到了短语“java子类型”和“true子类型”。这是在一个问题中以一种明确的方式给出的,它们是不同的。但是我找不到解释这两者之间的区别


有人能解释一下“java子类型”和“true子类型”之间的区别吗?

java子类型是扩展另一个类(甚至实现接口)的任何类。真正的子类型不是特定于语言的:

真正的子类型始终可以替换超类型。 “由超类型保证的任何属性必须由子类型保证(真正的子类型)”

这个链接包含了一个非常有启发性的例子。假设您有一个存储值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,则可能会出现更复杂的示例。员工和客户都提供与个人相同的字段和方法

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对象

我用谷歌搜索了这一页


这种区别听起来相当技术性,也不是很有用。

请参见解释这种区别的图片


因为类人类具有类脊椎动物的类似行为,即使它没有使用扩展实现关键字。这称为真子类型。而类Squid使用extends关键字扩展类脊椎动物,该关键字称为Java子类型

,如果您有两种类型,它们总是可以相互替换,我不清楚为什么一开始就有两种类型。这是否意味着一个真正的子类型将为同一个输入返回与超级类相同的输出,但Java子类型将为具有相同输入的超级类的方法返回不同的结果?在我发布的链接中是一个很好的例子。真正的子类型化是一种相当理论化的构造。我将补充答案,澄清为什么Squid不是脊椎动物的真正子类型?它是一种称为java子类型的子类型,因为您使用的是java关键字。我也不知道我们在哪里可以实际使用它。第一个不是真正的子类型,因为您应该注意,脊椎动物类中的@effects注释方法应该返回值>0,但是继承类返回0,这使得它比原始类弱!