子类在哪些方面与使用中的子类不同?

时间:2011-08-16 00:20:52

标签: java subclass subtype

通过扩展或实现链接类时建立子类型。子类型也用于泛型。

如何区分子类型和子类?

6 个答案:

答案 0 :(得分:13)

在Java中,子类化是一种子类型。

Java允许子类型化的方式有很多种:

  1. class A extends B时,AB的子类型,因为B b = new A(...);没问题。
  2. interface A extends B时,AB的子类型,因为B b = new A() { ... }没问题。
  3. class A extends B时,A[]B[]的子类型,因为B[] b = new A[0]没问题。
  4. class A implements B时,AB的子类型,因为B b = new A(...)没问题。
  5. 听起来你想要一种方法来区分其他人。以下应该这样做。

    static boolean isSubclass(Class<?> a, Class<?> b) {
      return !b.isArray() && !b.isInterface() && b.isAssignableFrom(a);
    }
    

    但由于类型擦除,它不会处理泛型类的子类型。 Class实例在运行时不携带类型参数,因此无法区分new ArrayList<String>()new ArrayList<Integer>()的运行时类型。

答案 1 :(得分:7)

通常,子类化意味着继承父级的属性。子类型仅意味着可以对子类型执行超类型的操作。请注意,子类化是子类型的特例。

在Java中,接口表示用于描述类型可以表现出什么行为的结构,这使得它成为子类型的自然表示。子类化体现在类层次结构中。

答案 2 :(得分:6)

子类与子类型不同。您可以创建非子类型的子类。要了解子类型是什么,让我们开始解释类型是什么。

当我们说数字5是整数类型时,我们声明5属于一组可能的值(作为示例,请参阅Java原始类型的可能值)。我们还指出,我可以对加值和减法等值执行一组有效的方法。最后我们说明有一组总是满足的属性,例如,如果我添加值3和5,我将得到8作为结果。

再举一个例子,想想抽象数据类型,整数集整数列表,它们可以容纳的值仅限于整数。它们都支持一组方法,例如 add(newValue) size()。并且它们都具有不同的属性(类不变),不允许重复,而 List 允许重复(当然还有其他属性,它们都满足)。

子类型也是一种类型,它与另一种类型有关系,称为父类型(或超类型)。子类型必须满足父类型的特征(值,方法和属性)。该关系意味着在期望超类型的任何上下文中,它可以由子类型替代,而不会影响执行的行为。我们来看看一些代码来举例说明我在说什么。假设我写了一个整数列表(用某种伪语言):

class List {
  data = new Array();

  Integer size() {
    return data.length;
  }

  add(Integer anInteger) {
    data[data.length] = anInteger;
  }
}

然后,我将整数集写为整数列表的子类:

class Set, inheriting from: List {
  add(Integer anInteger) {
    if (data.notContains(anInteger)) {
      super.add(anInteger);
    }
  }
}

我们的整数集类是整数列表的子类,但不是子类型,因为它并不令人满意 List 类的功能。满足方法的值和签名,但属性不满足。 add(Integer)方法的行为已经明确更改,而不是保留父类型的属性。从您的课程客户的角度思考。他们可能会收到整数集,其中需要整数列表。客户端可能希望添加值并将该值添加到列表,即使该值已存在于列表中。但如果价值存在,她就不会得到那种行为。对她来说太大了!

这是不正确使用继承的典型示例。在这种情况下使用组合。

(来自use inheritance properly的片段)。

答案 3 :(得分:5)

一次,维基百科给出了一个非常直接的答案:

http://en.wikipedia.org/wiki/Subtype_polymorphism

  

不应将子类型与(类或对象)的概念混淆   从面向对象语言继承;子类型是一种关系   类型之间(面向对象的说法中的接口),而   继承是源自a的实现之间的关系   允许从现有对象创建新对象的语言功能   那些。在许多面向对象的语言中,调用子类型   接口继承。

简而言之,当你从另一个派生一个接口(方法签名/访问点/对外界做出反应的方式)时会发生子类型化,而当你导出一个实现(方法,属性/内部​​状态和内部逻辑)时会发生子类化。来自另一个类的类继承。

此术语通常不以这种方式使用,类型通常是指data type

答案 4 :(得分:1)

在java中,subtyping适用于接口,但subclasses不适用于接口。

答案 5 :(得分:-3)

我不认为Java会区分它们吗?你只有课程。