首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从父类返回子类的类型?

从父类返回子类的类型可以通过使用泛型来实现。在父类中定义一个泛型方法,该方法的返回类型为子类的类型参数。然后在子类中重写该方法,并指定子类自身作为类型参数。这样就可以在父类中调用该方法时返回子类的类型。

以下是一个示例代码:

代码语言:txt
复制
class ParentClass {
    public <T extends ParentClass> T getChildClass() {
        // 在父类中返回子类的实例
        return (T) this;
    }
}

class ChildClass extends ParentClass {
    // 子类重写父类的方法
    @Override
    public ChildClass getChildClass() {
        return this;
    }
}

public class Main {
    public static void main(String[] args) {
        ParentClass parent = new ParentClass();
        ChildClass child = new ChildClass();

        // 通过父类调用泛型方法返回子类的类型
        ChildClass childFromParent = parent.getChildClass();
        System.out.println(childFromParent.getClass());  // 输出:class ChildClass

        // 直接调用子类的方法返回子类的类型
        ChildClass childFromChild = child.getChildClass();
        System.out.println(childFromChild.getClass());  // 输出:class ChildClass
    }
}

在上述示例中,父类ParentClass定义了一个泛型方法getChildClass(),该方法返回类型为T,并且限定T必须是ParentClass或其子类。子类ChildClass重写了该方法,并指定返回类型为ChildClass。在Main类中,通过父类和子类分别调用getChildClass()方法,可以得到返回的子类类型。

请注意,由于Java的类型擦除机制,泛型方法在运行时会擦除类型信息,因此需要进行类型转换(T) this。在使用时要确保父类和子类的类型一致,否则可能会导致类型转换异常。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

返回子类类型函数写法

this.retryLimit = retryLimit return this } abstract fun build(): PollingEvent } 我们有这么一个,...不过由于我们这个 Event 类型比较多,因此希望写一个父,来一个子类感受下: class DisposableEventBuilder : EventBuilder() { private....build() 我们调用完父 retryLimit 方法后,想要设置下 delay,结果发现没有这个方法。 “我 X,这什么玩意儿”,你嘟囔了一句。 因为返回是父,所以链式调用掉链子了。...,这个参数则必须是当前子类,那么这样的话我们就可以在返回自身类型位置返回 T 这个类型了。...子类改动就很简单了,只需要给父加一个泛型参数为自己类型即可: class DisposableEventBuilder : EventBuilder

4.7K10

Python中协议 、鸭子类型 、 抽象基 、混入

本篇文章探讨一下python中几个概念:协议 、鸭子类型 、 抽象基 、混入。 一、协议 在python中,协议是一个或一组方法。...二、鸭子类型(duck typing) 多态一种形式,在这种形式中,对象类型无关紧要,只要实现了特定协议即可。...通过输出结果就能看出,Eg1对象可以计算长度,也可以循环处理,这和正常序列没什么不同。因此我们可以把Eg1称为一个鸭子类型,即 只关注它是否实现了相应协议,不关注它类型。...print(issubclass(Cat, Animal)) 输出: True 这种通过注册和抽象基关联起来叫做虚拟子类,虚拟子类不会继承注册抽象基,而且任何时候都不会检查它是否符合抽象基接口...从概念上讲,混入不定义新类型,只是打包方法,便于重用。混入应该提供某方面的特定行为,只实现少量关系非常紧密方法并且混入绝对不能实例化。

1.8K20

【C++】类型转换 ④ ( 子类 和 父 之间类型转换 - 动态类型转换 dynamic_cast )

, 分析 C++ 环境下 使用 各种方式 进行 父子类 类型之间转换 , 推荐使用 动态类型转换 dynamic_cast ; 一、子类 和 父 之间类型转换 - 动态类型转换 dynamic_cast...一般用于 父 ( 对象 / 指针 / 引用 ) 和 子类 ( 对象 / 指针 / 引用 ) 之间转换 , 是 C++ 语言特有的 , C 语言中没有该转换类型 ; 1、构造父子类 编写一个 父...< "son2_say" << endl; } }; 2、子类 和 父 之间类型转换 - 隐式类型转换 先创建 子类对象 , 将子类对象 地址赋值给 父指针 , 其中包含了 隐式转换 ; 在下面的代码中...5、子类 和 父 之间类型转换 - 动态类型转换 dynamic_cast 动态类型转换 dynamic_cast , 一般用于 子类 和 父 之间类型转换 , 运行时 , 如果类型转换成功 ,...则进行转换 ; 运行时 , 如果类型转换失败 , 则返回转换结果 NULL ; 借助上述特性 , 动态类型转换 dynamic_cast 可用于在 运行时 识别对象类型 ; 将 对象 强转为 指定类型对象

37310

泛型相关时,如何在两个泛型之间创建类似子类型关系呢

比如可以将一个Integer类型对象分配给Object类型对象,因为Object 是Integer。...尽管Integer是Number子类型,但Box 和Box不是Box子类,它俩对象是Object。文首对话表达就是这个意思。...那么问题来了,当泛型相关时,如何在两个泛型之间创建类似子类型关系呢?例如如何让Box 和Box变得与Box有关呢?...为了搞懂这个问题,我们先来了解一下同一类型对象是如何实现子类型吧。...小结:可以通过继承泛型或者实现接口来对其进行子类型化。 搞懂了子类型问题,我们回到“如何在两个泛型之间创建类似子类型关系“问题。

2.8K20

Python 语言中 “鸭子类型

提到 “鸭子类型”,就要先讲讲面向对象编程语言中继承和多态。...可以看到子类 run() 方法覆盖了父 run()方法。该运行结果体现就是多态。简单来说,多态就是在子类中覆写父方法。这样做好处是同样名称方法在不同子类中会有不同行为。...鸭子类型 在程序设计中,鸭子类型(英语:duck typing)是动态类型一种风格。...在鸭子类型中,关注点在于对象行为,能作什么;而不是关注对象所属类型。...而在静态语言中,如 Java ,如果需要传入 Animal 类型,则传入对象就必须是 Animal 类型或者它子类,否则,将无法调用 run() 方法。 参考 [1].

72940

通过泛型获得子类Class类型 以及Type体系

子类在调用这些方法时候,需要根据子类类型获知子类Class类型;这个时候可以通过传入泛型,根据泛型类型来获取子类Class类型;  2、实现代码范例 父:public abstract class...> c = this.getClass(); //子类创建 会创建父 子类调用时 此处this是子类 Type t = c.getGenericSuperclass(); //获得带有泛型...,如果父方法中需要知道具体子类Class类型 则可以直接使用Child来使用;   此处原理就是在子类继承父时候 带有泛型 然后子类在创建时候,会调用父构造函数,构造函数中存在this...指子类,然后通过获得父,再获得父泛型 ;通过泛型找到子类类型; 3、原理分析   该实现是通过反射技术实现;下面看具体分析; 3、1 ParameterizedType ParameterizedType...Class里面同样在1.5版本加入了getGenericSuperclass()与getGenericInterfaces()两个方法,用于返回带参数化类型与接口。

4.7K20

子类赋值父赋值兼容

C++ 中,类型匹配检测是非常严格,但是你会发现一个现象,如果一个继承了另外一个,把子类对象赋值给父时候,系统不但不提示错误,而且程序还能顺利编译通过并运行。...这其实就是 C++ 内部提供赋值兼容过程,但是要注意,如果子类数据成员比父多,则会出现数据截断。...“; cout << “start (“ << _x << “,” << _y << “)” << endl; } protected: int _x; int _y; }; // 继承 Shape ...cout << “radio r = “ << _r << endl; } private: int _r; }; int main(int argc, char* argv[]) { // 实例化一个父对象...Shape s(3, 5); s.draw(); // 实例化一个子类对象 Circle c(1, 2, 4); c.draw(); cout << “————————“ << endl; // 子类对象给父变量赋值

15530

子类继承父,父初始化

《Thinging in Java》引用 基础及衍生,而不再是以前一个,所以在想象衍生结果对象时,可能 会产生一些迷惑。...从外部看,似乎新拥有与基础相同接口,而且可包含一些额外方法和字段。但继承并非仅仅简单地复制基础接口了事。创建衍生一个对象时,它在其中包含了基础一个“子对象”。...这个子对象就象我们根据基础本身创建了它一个对象。从外部看,基础子对象已封装到衍生对象里了。...个人总结: super关键字必须写在构造方法方法体内非注释代码首行 子类进行初始化,必须调用父构造方法,如果父所有构造方法都用private修饰了的话,则无法继承,编译报错....衍生构造方法调用父构造方法,如果父是无参构造方法,那么编译器会为衍生构造方法首行加上super()。 编译器会强迫我们在衍生构建器主体中首先设置对基础构建器调用。

1.9K30

语言设计中子类型风格

从鸭子类型,我们可以联想到它推导,并不在乎类型真正实体,只要他行为有鸭子特性,那么我们就可以把它当做一只鸭子来看到。...在动态语言设计中,可以解释为无论一个对象是什么类型,只要它具有某类型行为(方法),则它就是这一类型实例,而不在于它是否显示实现或者继承。      鸭子类型在动态语言中被广为奉行。...而java,c#这类静态强类型语言(当前首先声明c#已经不是纯静态强类型语言,它具有dynamic,表达式,当然这里所说c#是去掉这类特性,或者说C#2.0吧)我们传入对象是必须显示实现该接口实例...以上所说是两语言设计中对抽象制约区别。    ...他为javascript引入接口,类型,泛型等较完备类型系统,是的能够有更好IDE支持,从某种程度上来说,这是对鸭子类型或者javascript编译器检查推迟弥补。

79170

【C++】继承 ⑥ ( 类型兼容性原则 | 父指针 指向 子类对象 | 使用 子类对象 为 父对象 进行初始化 )

一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父 : 需要 基 ( 父 ) 对象..." 私有继承 " 派生 , 是 不具有 基 完整功能 , 因为 最终继承 后派生 , 无法在 外部调用 父 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...子类对象 , 父指针 值为 子类对象 在 堆内存 地址 , 也就是 将 子类对象 地址 赋值给 父类型指针 ; 引用 : 父引用 引用 子类对象 , 将 子类对象 赋值给 父类型引用 ; 二...或 父引用 , 此处可以直接传入 子类指针 或 子类引用 ; // 函数接收父指针类型 // 此处可以传入子类对象指针 void fun_pointer(Parent* obj) { obj...{ cout << "子类 funChild 函数" << endl; } }; // 函数接收父指针类型 // 此处可以传入子类对象指针 void fun_pointer

16500

Python_子类调用父方法

1.方式一 子类调用父方法,包含2中形式调用。一种形式是在内部通过继承方式调用父方法,另外一种形式是子类实例化后之后通过继承方式来调用父方法。如下图所示: ?...3班") #调用子类本身方法 student.course() #通过子类调用父方法--->实例化之后来调用父方法 student.eat() #调用子类方法,在子类方法中调用了子类方法,...与student.eat有区别 student.done() 此时如果父名称更改了,那么在子类中所有用到父地方均要进行修改了。...使用super好处,一是可以代替父名,这样后期父名更改了,我们只需要更改子类名称后面的父名即可,子类中其他名可以不用更改;二是使用了super后,调用父方法时可以不传参数self。..."11届土木3班") #调用子类本身方法 student.course() #通过子类调用父方法--->实例化之后来调用父方法 student.eat() #调用子类方法,在子类方法中调用了子类方法

4.8K20

【JAVA面向对象编程】--- 探索子类如何继承父

【不带参数默认叫咪咪,带参数需要自己传】 父初始化虽然执行了父构造方法,但没有生成父对象,这里只是帮助子类初始化从父继承过来属性。...总结: 在子类构造方法中,并没有写任何关于基构造代码,但是在构造子类对象(穿件对象)时,先执行基(父构造方法,然后执行子类构造方法, 因为: **子类对象中成员是有两部分组成...,基继承下来以及子类新增加部分。...父子父子肯定是先有父再有子,所以在构造子类对象时候 ,先要调用基构造方法,将从基继承下来成员构造完整,然后再调用子类自己构造方法,将子类自己新增加成员初始化完整**。...注意: 1,若父显式定义无参或者默认构造方法,在子类构造方法第一行默认有隐含super(调用,即调用基构造方法 2.如果父构造方法是带有参数,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适构造方法调用

7510

Java中基本类型子类介绍

本文将介绍Java中基本类型子类,包括原子更新整型、原子更新长整型、原子更新布尔型和原子更新引用型。...以下是原子类主要特点: 线程安全性:原子类提供了线程安全操作方法,可以在多线程环境下安全地更新变量值。...可扩展性:Java子类提供了一系列基本类型子类,如AtomicInteger、AtomicLong、AtomicBoolean等,同时也提供了原子更新引用类型子类AtomicReference...Java中基本类型子类 AtomicInteger:原子更新整型,提供了原子更新整型变量操作方法,如incrementAndGet()、decrementAndGet()等。...结论 Java中基本类型子类提供了一种方便且高效方式来进行并发编程。通过使用原子类,可以避免使用锁机制,降低线程之间竞争,提高程序性能。

16210

【说站】js子类型重写注意点

js子类型重写注意点 1、有时候子类型需要重写超类型方法。如果子类型重写方法写在更换原型之前,继承类型方法会覆盖子类型定义方法,重写无效。 2、子类型重写方法需要在更换原型后。...    console.log(this.name) } // 子构造函数 function Children() {     this.name = "children" } // 实现继承:子构造函数原型对象...=父构造函数实例对象 Children.prototype = new Father() // 在替换原型后,重写方法 Children.prototype.alertName = function ...console.log('在替换原型之后,重写方法有效') } // 创建子实例 let c = new Children() c.alertName()// 在替换原型之后,重写方法有效 以上就是js子类型重写注意点

1.1K50
领券