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

如何构造一个模板类类型,它可以替代子类,然后被泛型调用?

构造一个模板类类型,可以替代子类并被泛型调用的方法是使用泛型和继承的特性。下面是一个示例代码:

代码语言:txt
复制
public abstract class TemplateClass<T> {
    public abstract T getValue();
}

public class SubClass extends TemplateClass<String> {
    @Override
    public String getValue() {
        return "Hello World";
    }
}

public class GenericClass<T extends TemplateClass<?>> {
    private T value;

    public GenericClass(T value) {
        this.value = value;
    }

    public void printValue() {
        System.out.println(value.getValue());
    }
}

public class Main {
    public static void main(String[] args) {
        SubClass subClass = new SubClass();
        GenericClass<SubClass> genericClass = new GenericClass<>(subClass);
        genericClass.printValue();
    }
}

在上面的示例中,我们首先定义了一个抽象的模板类TemplateClass,其中的getValue方法是抽象的,需要在子类中实现。然后我们创建了一个子类SubClass,并指定了泛型类型为String,实现了getValue方法返回固定的字符串。

接下来,我们定义了一个泛型类GenericClass,其中的泛型类型T必须是TemplateClass的子类或者实现类。在GenericClass中,我们可以调用value.getValue()来获取具体子类中实现的值。

最后,在Main类中,我们创建了SubClass的实例,并将其传递给GenericClass的构造函数。然后调用printValue方法,输出了子类中实现的值。

这样,我们就构造了一个模板类类型,它可以替代子类,并且可以被泛型调用。

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

相关·内容

【C++】编程 ⑧ ( 模板继承语法 | 普通 继承 模板语法 | 模板 继承 模板语法 | 继承模板必须指定具体的类型参数列表 | 继承 模板 必须重写构造函数 )

一、普通 继承 模板语法 1、普通 继承 模板语法 模板 作为父 , 子类 继承 模板 , 需要 指定 具体的类型参数列表 ; 需要 重写 构造函数 , 其中必须调用 模板 具体...的 子类 : // 模板 继承时 , 需要具体化 模板 // 也就是 指定 模板类型参数列表 , 将 类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父占用内存大小..., 继承上述模板 , 模板子类 与 普通子类 区别就是 , 模板子类 需要在尖括号中指定 具体的 类型参数列表 的 数据类型 ; 此时 , 在继承时 , 继承的 模板 必须 声明 类型参数列表..., 调用 模板 具体构造函数 , 如果 子类 继承 模板 , 如果 子类没有实现 构造函数 , // 模板 继承时 , 需要具体化 模板 // 也就是 指定 模板类型参数列表...Father 模板 继承 模板 时 , 也需要 指定 父模板 的具体 类型 , 只是这个类型可以是 另外一个 T ; 下面的代码 是 模板 继承 模板的 代码 , Son2

91330

C++复习篇

25.型函数模板(兼容不同类型) 26.模板(兼容不同类型) 27.数值型函数模板和数值模板(兼容不同数值) 28.C++智能指针 29.Qt中的智能指针 1.const const和define...Child为例,在编译器中,可以子类对象退化为父对象,从而实现子类来初始化父,比如: Parent p1(Child()); //Child()构造函数会返回一个临时对象,从而通过子类初始化父...能够正确调用某个同名函数是哪个的对象 比如:当某个子类强制转换为父时,则父的虚函数也会被替代子类的,从而实现程序灵活性 一个典型的示例,如下所示: class Base //父 { public...cout<<b<<endl;           //2.5 return 0; } 26.模板(兼容不同类型) 模板和函数模板一样,都是进行2次编译,需要注意的是定义对象必须显示指定所有类型...(兼容不同数值) 数值类似,但是数值型模板必须在编译时唯一确定 示例1-数值型函数模板: template //定义一个值T,还有个int的数值

1.3K20
  • 《Effective C++》学习笔记

    让自己习惯C++ 条款01:视C++为一个语言联邦 C++可视为: C:以C为基础。 面向对象的C++:添加面向对象特性。 模板C++:编程概念,使用模板。...如果担心因此忘记做特异化实现,可以利用纯虚函数,在父给纯虚函数一个实现,然后子类的该函数的实现中调用它,这样就会记得在需要特异化的子类中进行其他特异化实现。...条款35:考虑虚函数以外的其他选择 虚函数(本质是希望子类的实现不同)的替代方案: 用public的非虚函数来调用private的虚函数具体实现,非虚函数必须为子类继承且不得更改,所以决定了何时调用以及调用前后的处理...虚继承会增加大小、速度、初始化(及赋值)复杂度等成本,如果虚基不带任何数据,将是最具使用价值的情况。 模板编程 条款41:了解隐式接口和编译期多态 模板都支持接口和多态。...做法是声明一个构造函数,也就是定义一个模板构造函数,接收模板参数,声明一个指向的真实对象指针,声明一个获取该对象指针的get函数,用该get函数放在初始化列表中来构造模板

    1.1K20

    java 全解 - 绝对最详细

    复制代码 的思想很早就存在,如C++中的模板(Templates)。模板的精神:参数化类型 1.2 基本概述 的本质就是"参数化类型"。...,同时该类也是一个的情况下应该如何使用构造器:因为构造可以显式指定自己的类型参数(需要用到菱形,放在构造器之前),而自己的类型实参也需要指定(菱形放在构造器之后),这就同时出现了两个菱形了...表示集合中的所有元素都是Animal类型或者其子类 List<?...例如: 这样就确定集合中元素的类型,虽然不确定具体的类型,但最起码知道其父然后进行其他操作。 //Cat是其子类 List<?...但是可以进行add()方法,add()方法可以添加T类型和T类型子类型,如第二个例子中首先添加了一个Cat类型对象,然后添加了两个Cat子类类型的对象,这种方法是可行的,但是如果添加一个Animal类型的对象

    3.9K20

    Java的

    是我们需要的程序设计手段。使用机制编写的程序代码要比那些杂乱地使用 Object 变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。至少在表面上看来,很像 C++ 中的模板。...与 Java —样,在 C++ 中,模板也是最先添加到语言中支持强类型集合的。但是,多年之后人们发现模板还有其他的用武之地。学习完本章的内容可以发现 Java 中的在程序中也有新的用途。...为什么要使用程序设计程序设计(Generic programming)意味着编写的代码可以很多不同类型的对象所重用。...如何设计才能只允许前一个调用,而不允许后一个调用呢?Java 语言的设计者发明了一个具有独创性的新概念,通配符类型(wildcard type),解决了这个问题。...方法前面已经介绍了如何定义一个。实际上,还可以定义一个带有类型参数的简单方法。

    24230

    C Sharp(十二)

    ,看看如何创建并使用。...创建使用非有两步: 声明和创建的实例。 但是不是实际,而是模板,所以我们必须先从模板构建出实际类型然后创建这个构建后的类型的实例。...接口名: 只有这个接口或实现这个接口的类型才能做 type argument new(): 任何带有无参构造类型才能做 type argument 顺序: 主约束必须放在第一位且只有一个: 主约束只能是名...与其他的不同,方法是成员而不是类型,它可以用于、非、结构或接口。..., int>(); 如果我们在调用方法时,可以从方法参数推断出类型实参,则可以省略类型实参: public void MyMethod (T t) { //... } int IntVal

    83520

    精选Java基础面试120题

    的好处 提高了程序的安全性 将运行期遇到的问题转移到了编译期 省去了类型强转的麻烦 的常见应用 方法 接口 2.21 如何编写一个方法,让它能够接受参数并返回类型?...并举例 方法,指把定义在方法上,使用类型替代原始类型 public static T[] sort(T[] t){ Arrays.sort(t); return t; } 2.22...请简述Java中如何使用编写带有参数的?...并举例 ,指把定义在上,使用类型替代原始类型 class GenericClass { private T t; public void setT(T t) { this.t...每一个构造方法的第一条语句默认都是:super() 如果父中没有空参数的构造方法,通过下列方式解决 子类通过super去显示调用其他的带参的构造方法 子类通过this去调用本类的其他构造方法(本类其他构造也必须首先可以访问了父构造

    77820

    Java基础八股文(背诵版)

    当垃圾回收器准备好释放对象占用空间时,首先会调用 finalize()方法,并在下一次垃圾回收动作发生时真正回收对象占用的内存。 简述 ,即“参数化类型”,解决不确定对象具体类型的问题。...在使用过程中,操作的数据类型指定为一个参数,这种参数类型中称为、接口中称为接口和方法中称为方法。...简述擦除 Java 编译器生成的字节码是不包涵信息的,类型信息将在编译处理是擦除,这个过程被称为擦除。 简述注解 Java 注解用于为 Java 代码提供元数据。...@Inherited:一个@Inherited 注解了的注解修饰了一个,如果他的子类没有其他注解修饰,则子类也继承了父的注解。...Java 反射机制是指在程序的运行过程中可以构造任意一个的对象、获取任意一个的成员变量和成员方法、获取任意一个对象所属的信息、调用任意一个对象的属性和方法。

    44.7K2738

    C#高级语法之约束,类型安全、逆变和协变(思想原理)

    其实就是一个不确定的类型可以用在和方法上,在声明期间没有明确的定义类型,编译完成之后会生成一个占位符,只有在调用调用时,传入指定的类型,才会用确切的类型将占位符替换掉。...如果我们有方法可以做到,让调用者来决定添加什么类型(具体的类型,例如Dog、Pig),然后我们创建什么类型,是不是这些问题就不存在了?可以做到。...二、约束 约束就是对(传入的类型)进行约束,约束就是指定该类型必须满足某些特定的特征,例如:可以实例化、比如实现Animal等等 我们来看一下官方文档上都有那些约束: 说明 对多个参数应用约束...我们在写一个继承Animal的Tiger子类然后私有化构造函数 //动物子类 Tiger public class Tiger : Animal { //私有化构造函数 private...; 协变的作用就是可以子类隐式转换为父,而逆变就是将父隐式转换为子类 将接口类型改为使用in关键字 public interface IAnimalHouse where

    6.9K30

    本章内容包括: 声明型函数和 类型擦除和实化类型参数 声明点变型和使用点变型 9.1 类型参数 // 如果要创建一个空的列表,必须显示的指定,有值的话可以推导出来...调调用带实化类型参数函数的时候使用非实化类型形参作为类型实参 * - 把、属性或者非内联函数的类型参数标记为reified */ 9.3 变型:子类型化...类型子类型 ----------------------*/ // 每一个Kotlin可以用于构造至少两种类型 var x: String var...变型是一种说明两种拥有相同基础类型和不同类型参数的类型之间子类型化关系的方式,说明了如果其中一个类型类型参数是另一个类型参数的子类型 这个类型就是另外一个类型子类型或者超类型。...在Kotlin 中既可以为整个指定变型(声明点变型),也可以类型特定的使用指定变型(使用点变型)。 当确切的类型实参是未知的或者不重要的时候,可以使用星号投影语法。

    1.8K10

    吃透这些内容,c++ 不再难学

    《C++ Primer》 里专门有一章,叫 Copy Control,介绍如何定义、使用:复制构造、复制赋值、移动构造、移动赋值等。...protected 成员的逻辑跟其他语言也有所不同: protected 可以子类访问 可以 friend 访问 可以子类修改权限描述符 class A { protected: int...,实例化的子类对象里包含了 子类成员部分+父成员部分。...面向模板编程 c++ 的与 java 的有所不同,实现上: java 原理是编译时类型擦除,比如把 T 编译为 Object,然后运行时动态转换类型 c++ 模板原理时编译时特例化,根据模板...、模板函数,编译生成对应、函数的代码 所以在运行性能上,c++ 的模板性能要高于 java;在编译代码结果上,c++ 编译出来的代码量要远大于 java。

    1.4K30

    带着问题高效学Android:关于Java与Kotlin你应该知道的知识点

    阅读本文前,下面先列出几个问题 1.为什么我们需要? 2.如何定义如何定义方法? 3.怎么限定类型变量? 4.有什么局限性? 5.类型的继承规则是怎样的?...也就是说在使用过程中,操作的数据类型指定为一个参数,这种参数类型可以用在、接口和方法中,分别被称为接口、方法。...方法,是在调用方法的时候指明的具体类型方法可以在任何地方和任何场景中使用,包括普通。...因为是要在对象创建的时候才知道是什么类型的,而对象创建的代码执行先后顺序是static的部分,然后才是构造函数等等。...不知道,但是可以肯定的说,Object一定是的超,所以get方法返回Object。编译器是可以确定知道的。对于set方法来说,编译器不知道需要的确切类型,但是X和X的子类可以安全的转型为X。

    1.1K00

    Effective Java笔记(不含反序列化、并发、注解和枚举)

    2.能复用:不必每次调用都创建新的类型,对于频繁创建而变化又不是很大的有大帮助 3.可抽象:构造方法只能返回本类的实例,而这个可以返回本类的任何子类型 劣势: 1.如果类没有public或protect...2.复合转发就可以代替一部分继承的情况 1.如HashSet,我们需要在其上面扩展,可以实现Set并内置一个HashSet对象,然后在各个方法中调用HashSet的相应方法,当然可以调用前后进行我们自己的操作...4.在绝大部分情况下用复合替代继承,能隐藏拓展细节,恶意避免扩展中api的缺陷,传染到拓展中 4.要么为继承而设计并提供文档说明要么禁止继承: 1.要设计一个可被继承的,需要做的事情...,那么就可设置为私有 3.构造器不能调用可被覆盖的方法, 4.对于不是为了继承而设计的普通可以禁止子类化 5.对于自用性,可以使用替代私有辅助方法代替需要自用的可覆盖的方法 5.接口优于抽象 6....接口只用于定义类型: 1.常量接口模式是不良的模式 2.导出常量可以在具体之中 7.用函数对象表示策略:策略模式 4. 1.不要在新代码中使用原生态类型: 1.每个都定义了一 个原生态类型

    950110

    深入理解java的

    简介 是JDK 5引入的概念,的引入主要是为了保证java中类型的安全性,有点像C++中的模板。 但是Java为了保证向下兼容性,全部都是在编译期间实现的。...编译器执行类型检查和类型推断,然后生成普通的非的字节码。这种就叫做类型擦除。编译器在编译的过程中执行类型检查来保证类型安全,但是在随后的字节码生成之前将其擦除。 这样就会带来让人困惑的结果。...和协变 有关协变和逆变的详细说明可以参考: 深入理解协变和逆变 这里我再总结一下,协变和逆变只有在类型声明中的类型参数里才有意义,对参数化的方法没有意义,因为该标记影响的是子类继承行为,而方法没有子类...当然java中没有显示的表示参数类型是协变还是逆变。 协变意思是如果有两个 A 和 A, 其中C是T的子类,那么我们可以用A来替代A。 逆变就是相反的关系。...所以我们在使用时候的一些操作会遇到问题。 假如我们有一个中有一个方法,方法的参数是,我们想在这个方法中对参数进行一个拷贝操作。

    41910

    知多少

    简介 是JDK 5引入的概念,的引入主要是为了保证java中类型的安全性,有点像C++中的模板。 但是Java为了保证向下兼容性,全部都是在编译期间实现的。...编译器执行类型检查和类型推断,然后生成普通的非的字节码。这种就叫做类型擦除。 编译器在编译的过程中执行类型检查来保证类型安全,但是在随后的字节码生成之前将其擦除。 这样就会带来让人困惑的结果。...当然java中没有显示的表示参数类型是协变还是逆变。 协变意思是如果有两个 A 和 A, 其中C是T的子类,那么我们可以用A来替代A。 逆变就是相反的关系。...接下来我们考虑的情况,List 是不是 List的父呢?很遗憾,并不是。 我们得出这样一个结论:不是协变的。 为什么呢?...所以我们在使用时候的一些操作会遇到问题。 假如我们有一个中有一个方法,方法的参数是,我们想在这个方法中对参数进行一个拷贝操作。

    1.1K10

    .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(下)

    Unable to resolve service for type 'DependencyInjectionDemo.Services.IOrderService' 下面介绍如何注册模板 当需要注册一组实现的时候...实际上注册的时候并不知道的具体类型入参 依赖注入框架为我们提供了模板的注册方式 通过一行代码来注册所有此的具体实现 定义一个接口 namespace DependencyInjectionDemo.Services...API 注册 需要注册两个 service 的 type 第一个入参是服务的类型 第二个入参是服务实现的类型 接下来,看看如何在 controller 中使用 // 在构造函数中添加两个入参,IOrderService...和 IGenericService // 通过断点调试查看 genericService 的类型可得知,的具体实现可以用容器里面的任意类型替代 public WeatherForecastController...通过 [FromServices] 注入 当定义一个 controller 的时候 的服务是大部分接口都需要使用的情况下 推荐的做法是用构造函数注入的方式 如果这个服务仅仅在某一个接口使用的情况下

    90710

    1、Java中的是什么 ? 使用的好处是什么?   是Java SE 1.5的新特性,的本质是参数化类型,也就是说所操作的数据类型指定为一个参数。...2、Java的如何工作的 ? 什么是类型擦除 ?如何工作?   ...1、类型检查:在生成字节码之前提供类型检查   2、类型擦除:所有类型参数都用他们的限定类型替换,包括、变量和方法(类型擦除)   3、如果类型擦除和多态性发生了冲突时,则在子类中生成桥方法解决   ...4、如果调用方法的返回类型擦除,则在调用该方法时插入强制类型转换 类型擦除:   所有类型参数都用他们的限定类型替换:比如T->Object   ?...8、如何编写一个方法,让它能接受参数并返回类型?   编写方法并不困难,你需要用类型替代原始类型,比如使用T, E or K,V等广泛认可的类型占位符。

    1.1K50

    面向对象编程基础2(干货)

    目的:统一提高效率,但是又存在子类差异性如何体现问题。 概念:虚方法--声明为virtual的方法即为虚方法,基的虚方法可以在派生中使用override进行重写。...概念4: 1.:可理解为一个模子,装入类型的材料,就可以塑造出想要的产品。 2.语法展示: ? ? 3.使用的原因: ? 4.实例化过程 ?...5.优势:代码量更小。 只有需要的类型才会被实例化 易于维护,修改模板,所有的实例都会改变。...6.方法:方法就是方法的模型,给定具体的类型,就可以实例化出一个操作该类型的具体方法。(方法可存在于和普通中) 7.语法展示: ? ? ? 8.约束:约束就是控制的控制器。...目的是缩小参数的范围。和方法都可以添加约束,只有添加了约束,才能调用参数中的方法,否则只能调用那些其他的方法。关键词where。 ? ? ?

    1.1K20

    编码最佳实践——里氏替换原则

    子类型可以重写(或部分定制)客户端所调用的基的任意方法。 子类型:继承自基类型(T)的一组(S)中的任意一个。客户端不应该,也不需要知道它们实际调用哪个具体的子类型。...协变 下图展示了一个非常小的层次结构,包含了基(超)Supertype和子类Subtype。 多态是一种子类型看做基类型实例的能力。...EntityRepository重新定义为一个需要类型,把Entity类型作为参数传入。...这个参数是可以协变的,UserRepository子类可以为User指定超类型。...如图所示,参数由关键字in标记,表示它是可逆变的。这表明层析结构已经颠倒了:IContravariant成为了超,IContravariant则变成了子类

    1.3K20
    领券