最近看java编程思想看到协办返回类型有点迷糊,百度知道里有位兄弟总结挺好,在这分享下:
在Java1.4及以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值也必须完全一样。
Java5.0放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。
注意:"协变返回(covariant return)",仅在subclass(子类)的返回类型是superclass(父类)返回类型的extension(继承)时才被容许。
举例:
=====================================
class Base{
public Object OverrideredFunction(){
return new Object();
}
}
class Inherit extends Base{
//String死Object的子类,所以可以这么写
@Override public String OverrideredFunction(){
return "Nice!";
}
}
=====================================
class Base{
public String OverrideredFunction(){
return "NO!";
}
}
class Inherit extends Base{
//String和Integer虽然都是Object的子类
//但这么写的话编译错误
@Override public Integer OverrideredFunction(){
return new Integer(10);
}
}
=====================================
另外,实践表明,就算返回的两个类继承自同一个interface,也无法进行协变。
分享到:
相关推荐
在Java编程语言中,"可变(协变)返回类型"是一个重要的概念,它涉及到泛型和类型安全。本文将深入探讨这个主题,并结合提供的`Test.java`文件,来理解如何在实际编程中应用协变返回类型。 首先,我们要明白什么是...
在Java编程语言中,协变返回类型是一种特性,它允许子类在重写父类方法时,返回一个比父类方法更具体的类型。这在某些情况下可以提高代码的灵活性和可读性。Java 5.0及后续版本开始支持这种协变特性。下面将详细解释...
本教程将重点关注其中的一个重要特性——协变返回类型,从IL(Intermediate Language)层面进行深入剖析。IL是.NET Framework中的中间语言,是源代码编译后的产物,用于跨平台执行。了解IL有助于我们理解.NET框架的...
协变返回类型允许子类覆盖父类的方法时,返回类型可以是父类返回类型的子类型,这在泛型上下文中尤为重要,能够保持代码的灵活性和类型安全性。 #### 六、泛型的实际应用与注意事项 在实际编程中,合理运用泛型...
4. 涵盖了所有新的语言特性,包括自动装箱、可变参数方法、增强的for循环以及协变返回类型。 5. 引入了关键的新类,如Formatter和Scanner。 这本书不仅是一个权威的Java语言教程,同时也是一本不可或缺的参考书,...
此外,书中还新增了断言和正则表达式的重要部分,涵盖了自动装箱、可变参数方法、增强型for循环和协变返回类型等所有新的语言特性。同时,本书也对Formatter和Scanner等关键新类进行了介绍。 《Java编程语言 第四版...
4. **语言新特性**:涵盖了从自动装箱、变长参数方法到增强的for循环和协变返回类型的全部新特性。 5. **新类覆盖**:介绍了如Formatter和Scanner等关键新类,这些类在处理格式化输出和输入方面极为有用。 本书系统...
因此,协变通常应用于只读场景,例如函数的返回类型。 **逆变(Contravariance)** 恰恰相反,它使泛型类型参数的父类型关系被传播。如果`A`是`B`的父类型,那么`List<A>`是`List<B>`的父类型。Kotlin使用`in`...
- **协变返回类型(Covariant Return Types)**:这种方法允许子类重写父类的方法并改变其返回值的类型,但必须确保子类的返回类型是父类返回类型的子类型。 ##### 3. 新增的关键类 - **Formatter类**:提供了格式...
2. 方法签名:Java的方法签名包括返回类型、方法名和参数列表,C#也是这样,但C#允许方法重载,可以根据不同的参数列表定义多个同名方法。 3. 注释:Java使用`//`和`/*...*/`进行单行和多行注释,C#则有`//`、`///`...
7. **泛型方法**:除了泛型类,我们还可以定义泛型方法,方法的返回类型和参数列表可以包含类型参数。这增加了方法的灵活性,使得方法可以处理不同类型的参数。 8. **泛型与反射**:虽然泛型信息在运行时不存在,但...
重写(Override)是指子类对父类中的方法进行重新实现,必须保证子类方法与父类方法具有相同的名称、参数列表和返回类型(协变返回类型除外)。重写体现运行时多态,与访问权限和抛出的异常也有关。重载与返回类型...
4. **基类和派生类中对应的方法的签名必须相同**:包括方法名、参数列表以及返回类型。 5. **基类和派生类的方法的返回对象类型必须相同或者返回对象类型必须是协变的**:协变指的是如果子类可以替代父类,则子类...
自Java 1.5起,接口方法的改写允许返回类型更加宽松,即子接口或实现类的方法返回类型可以是父接口方法返回类型的子类型,这是协变返回类型(covariant return type)。然而,如果方法的返回类型仅仅是不同的,那么...
从Java 7开始,子类方法的返回类型可以是父类返回类型的派生类,这称为协变返回类型。 3. **访问修饰符**:重写方法的访问权限不能低于被重写方法。比如,如果父类方法是`public`,子类重写方法不能声明为`...
6. **返回类型**:多态方法的返回类型必须相同,或者返回类型之间存在协变关系(例如,父类类型可以作为子类类型的返回类型)。 7. **访问控制**:派生类的方法访问修饰符不能比基类更严格,这意味着如果基类方法是...
从 软 件的 设 计 风 格 、 设计 方 法 、 设 计 目 标 到 设 计 过 程 ,都 会 产 生 彻 底 的 变 革 ,"甚 至 会改 变 此 星 球 的 生活 方 式 "。 在 这 次 会 上 ,Java的 创 始 人 之 一 James Gosling 说 :...
4. 返回类型可以是相同的,或者子类的返回类型可以是父类返回类型的子类型(协变性)。 5. 派生类的方法访问修饰符不能比基类的更严格,即子类的访问权限不能小于父类。 多态的类型可以分为四种,源自Luca Cardelli...
泛型的协变返回类型(Covariant Return Types)允许子类重写方法时返回比父类更具体的类型。 通过对比Java泛型和C++模板(Templates),我们可以看到两者在设计上有相似之处,但也有本质的区别。Java的泛型提供了比...