Подтип java - это любой класс, который расширяет другой класс (или даже реализует интерфейс). Истинный подтип не является специфическим для конкретного языка:
Подлинный подтип всегда может быть заменен на супертип. «Любое свойство гарантируется надтип должно быть гарантировано подтипом (истинно) подтипирования»
http://www.cs.washington.edu/education/courses/cse331/10au/lectures/subtypingexamples.pdf
ссылка содержит очень enlightning примера. Допустим, у вас есть класс Point2D, который хранит значения x и y. Теперь вы можете создать подтип Point3D и добавить значение z. Если вы не переопределяете какие-либо методы и не заботитесь о методах equals и hashcode, вы можете в любой момент заменить экземпляр Point3D экземпляром Point2D.
Это простой пример, конечно. Можно утверждать, почему не только Point3D. Возможно, классы предлагают некоторые методы, которые могут - делясь на классы - лучше распознаваться как принадлежащие к 2D или 3D-сфере. В этом случае это, вероятно, будет чисто конструктивным решением.
class Point2D {
int x;
int y;
}
//true subtype
class Point3D extends Point2D {
int z;
}
Более сложный пример может возникнуть, если взять класс 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. Однако Клиент не является истинным подтипом, потому что реализация equals отличается (и, предположительно, hashCode()), и она не будет вести себя одинаково и, вероятно, не может быть заменена объектом Person во все времена.
Если у вас есть два типа, которые всегда могут быть заменены друг на друга, его непонятно, почему у вас есть два типа в первую очередь. –
Означает ли это, что истинный подтип вернет тот же результат для того же ввода, что и суперкласс, но этот подтип Java вернет другой результат для метода суперкласса с тем же входом? – SIMEL
в ссылке, которую я опубликовал, является хорошим примером. истинный подтипирование - довольно теоретическая конструкция. я добавлю к ответу, чтобы уточнить – Yashima