1、背景介绍 在实现SSH框架中,DAO层向数据库持久化的过程中,因为大部分保存对象的方法都会调用到sava();所有索性就把save delete update select 方法进行封装到父类中,这时候就遇到了个问题...,子类在调用这些方法的时候,需要根据子类的类型获知子类Class类型;这个时候可以通过传入泛型,根据泛型的类型来获取子类的Class类型; 2、实现代码范例 父类:public abstract class...> c = this.getClass(); //子类创建 会创建父类 子类调用时 此处的this是子类 Type t = c.getGenericSuperclass(); //获得带有泛型的父类...this.child= (Class) p[0]; } } 在子类调用父类的方法时,如果父类的方法中需要知道具体子类的Class类型 则可以直接使用...Child来使用; 此处的原理就是在子类继承父类的时候 带有泛型 然后子类在创建的时候,会调用父类的构造函数,构造函数中存在this指的的是子类,然后通过获得父类,再获得父类的泛型 ;通过泛型找到子类类型
对话中的截图如下: 看了阿Q的解释,你是否也和“马小跳”一样存在疑问呢?请往看 我们都知道在java中,只要是类型兼容,就可以将一种类型的对象分配给另一种类型的对象。...那么问题来了,当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢?例如如何让Box 和Box变得与Box有关呢?...小结:可以通过继承泛型类或者实现接口来对其进行子类型化。 搞懂了子类型化的问题,我们回到“如何在两个泛型类之间创建类似子类型的关系“的问题。...泛型类或者接口并不会仅仅因为它们的类型之间有关系而变得相关,如果要达到相关,我们可以使用通配符来创建泛型类或接口之间的关系。...extends Number> 因为Integer是Number的子类型,numberBox的泛型是Number对象子类,所以在intBox和numberBox之间存在关系。
解决问题的思想: /* * 思想: * java中,父类的方法传入的形参的数据类型是泛型,子类的方法的形参想只要一种确定的数据类型,子类该如何做呢?...* 答:那么子类可以重新写一个方法,形参传入的是一种想要的数据类型,而子类方法里面调用的还是父类的方法。
测试环境: win7 64位 Python版本:Python 3.3.5 代码实践: 1、在子类中通过“类名”调用父类的方法 class FatherA: def __init__(self)...__init__(self) # 在子类中调用父类的方法:父类名.方法名称(参数) if __name__ == '__main__': b = SubClassB() 运行结果: >>> ==...(如类SubClassB的父类由FatherA变为FatherD时),必须遍历整个类定义,把子类中所有的父类类名全部替换过来 2、在子类中通过“super”方法调用父类的方法 场景1、单层继承 class...__init__() # 在子类中调用父类的方法:super().方法名称(参数) if __name__ == '__main__': b = SubClassB() class FatherA...__init__() # 在子类中调用父类的方法:super(type, obj).方法名称(参数) if __name__ == '__main__': b = SubClassB() 运行结果
泛型的使用方式有以下几种: 泛型类:定义一个类时,可以在类名后面加上尖括号,并在其中指定类型参数。这样,在类中就可以使用这个类型参数来声明属性、方法等。...MyGenericClass 是一个泛型类,T 是类型参数,可以在类中的属性和方法中使用。...泛型接口:与泛型类类似,可以在接口名后面加上尖括号,并在其中指定类型参数。然后在实现该接口时,需要指定具体的类型。...泛型方法:在普通类或者非泛型类中,可以定义一个泛型方法,即在方法返回值前面加上尖括号,并在其中指定类型参数。...printValue 是一个泛型方法, 是类型参数,在方法中可以使用这个类型参数。
在这里相当于声明了一个泛型限定类型,该类中的成员属性或者方法都可以直接拿来用。 泛型方法 这里大家需要明确一点的是,泛型方法并不一定依赖其外部的类或者接口,它可以独立存在,也可以依赖外围类存在。...所以子类数组实例赋值父类数组实例,只不过意味着父类数组实例的引用指向堆中子类数组而已,并不会有所冲突,因此是 Java 允许这种操作的。 而泛型是不允许这么做的,为什么呢?...那么,假如有某种需求,我们的方法既要支持子类泛型作为形参传入,也要支持父类泛型作为形参传入,又该怎么办呢?...>:通配任意一种类型 :必须是某个类型的父类 通配符相当于一个集合,符合通配符描述的类型都被框进集合中,方法调用时传入的实参都必须是这个集合中的一员,否则将不能通过编译。...具体原因是什么,我们也详细介绍了,大致意思就是,父类容器可以放任意类型的元素,而子类容器只能放某种特殊类型的元素,如果父类代表了某一个子类容器,那么父类容器就有可能放入非当前子类实例所允许的元素进入容器
ArrayList--get方法 ArrayList--get方法 查看源码发现,ArrayList在get方法中,已经显式进行了类型转换; 自定义一个泛型类,在get方法中不进行类型转换的声明,看看结果如何...子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。...接下来,让我们看一个例子,来具体的分析; 父类Test 子类TestChild 由于泛型擦除的存在,在程序运行期间,Test类在JVM虚拟机中实际的形态如下: 编译后Test类 泛型被擦除,泛型变量替换为...既然不是重写,并且Test 和 TestChild又是子父类关系,那么set方法从定义上来看只有可能是重载的关系;子类继承父类方法,在TestChild中形成重载:setT(Object t)、setT...当然,需要区分5.3章节中的情况: 5.3 泛型方法 泛型方法 在泛型方法中,自己定义的泛型变量,与类无关; 6. 通配符与上下界 在我们实际工作中,常见的通配符有3类: 无限定通配符,形式:<?
⭐语法 基本泛型类定义: class 泛型类名称 { // 这里可以使用类型参数 } 这里的泛型类名称是类的名称就,是定义在尖括号中的类型参数列表,它们是占位符...,用于在类的定义中指定不确定的类型。...,并且可以在继承时使用父类的类型参数。...子类可以选择性地覆盖或保留父类的类型参数。...当泛型类被类型擦除时,如果泛型类中的类型参数部分指定上限(如),则类型参数会被替换成类型上限。
泛型 泛型就相当于集合的标签,我们在使用集合的时候,就是在使用泛型 要知道的是在jdk1.5以前我们只能把集合中的元素设计为Object,之后引入了泛型的概念来解决,我们把元素的类型设计成一个参数,...System.out.println(a); } } public static class Text01 extends Text{ } } 指定父类中的泛型...,子类中无需再指定泛型,可以直接继承自父类中指定好的泛型,那么既然有指定好的,那么我们来看一下没有指定好的泛型是什么情况?...如果父类不明确指定泛型,那么子类也会变成一个泛型类,这个E的类型可以在创建子类对象的时候确定 这像不像ArrayList中的源码呢?...泛型方法 这里有一个比较容易混淆的概念,泛型方法。 这是不是一个泛型方法呢?不是!并不是带泛型就是泛型方法 泛型方法的参数类型无关于当前类的泛型,我们通过下面的代码来看一下!
这次总结一个个人认为的反模式:“绑定子类的泛型层基类”,这个模式在一些著名的框架中也见到过,如果CSLA、BlogEngine。我自己在原来的写的框架中,也用到过。 ...基于这个基类的代码重用,使得子类的代码非常简单。这里和普通继承、普通泛型的不同点在于父类在运行时绑定了具体子类的类型。 设计原理 为什么要这样设计?基类为什么不直接使用非泛型的基类呢?...这是为了在基类实现的通用方法中,能够以强类型的方式直接访问最终的子类。...同样的功能,如果你要使用非泛型的基类,由于所有类型共享一个运行时基类,你需要考虑为在基类中为每个具体的类型存储对应的值,例如,使用一个字典存储: public abstract class EntityBase...* 要不就是所有的类都直接写成一个泛型类+一个空子类的方法。(这个设计丑陋吗?)
引入泛型的意义何在? 泛型的提出是为了编写重用性更好的代码。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 ...泛型接口:实现类在实现泛型接口时需要指明具体的参数类型,不然默认类型是 Object类型。 泛型方法:如果所在的类是泛型类,则直接使用类声明的参数,如果不是,则需自己声明参数类型。 泛型通配符 : 在类型参数中使用 extends 表示这个泛型中的参数必须是 E 或者 E 的子类,这样有两个好处: 如果传入的类型不是 E 或者 E 的子类,编辑不成功。...泛型中可以使用 E 的方法,要不然还得强转成 E 才能使用。 : 在类型参数中使用 super 表示这个泛型中的参数必须是 E 或者 E 的父类。 小结: 无限制通配符<?...它们的目的都是为了使方法接口更为灵活,可以接受更为广泛的类型。 用于灵活写入或比较,使得对象可以写入父类型的容器,使得父类型的比较方法可以应用于子类对象。 < ?
OO(面相对象)六大设计原则之一的LSP(里氏代换原则 Liskov Substitution Principle),里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。...,同理基本类型封装类为Number类的子类,关于自动装箱和自动拆箱是java在JDK1.5的时候引入的新特性,我们这里不多讲,上面的代码可以正常编译,并且输出下面的内容,这里,数组里的基本类型装箱为封装类放到了堆中...,这些封装类可以出现在Number类定义的数组中,说明子类可以替换了父类,即数组是满足协变的。...对于协变和逆变是否支持 泛型不支持协变也不支持逆变,即不能把一个父类对象赋值给一个子类类型变量,相反也是同理。...:子类的方法返回值的类型比父类方法宽,此时为逆变方法。
@TOC 1.什么是泛型 是在定义类、接口和方法时,可以在声明时通过一定的格式指定其参数类型 使用时再指定具体的类型,从而使得类、接口和方法可以被多种类型的数据所实例化或调用 这种可以在编译时进行参数类型检查的技术被称为泛型...减少了源代码中的强制类型转换,代码更加可读 案例 图片 3.泛型的分类 可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法 泛型字母通常类型参数都使用大写的单个字母 T:任意类型 type...,那父类和子类的类型要一致; 如果子类泛型有多个,那需要包括父类的泛型类型 图片 (4)泛型接口 规则和泛型类一样 如果实现类是泛型类,那接口和实现类的泛型类型要一致;如果实现类泛型有多个,那需要包括接口的泛型类型...>,如List 主要作用就是让泛型能够接受未知类型的数据 可以把 ?看成所有泛型类型的父类,是一种真实的类型,类型通配符是实参,不是形参 固定上边界的通配符 采用<?...} } 图片 8.泛型数组的创建 在 Java 中是不能直接创建泛型对象和泛型数组的 主要原因是 Java 有类型擦除,任何泛型类型在擦除之后就变成了 Object 类型或者对应的上限类型 那定义的类中如果需要用到泛型数组
对于更通用的泛型来说,对于支持协变的泛型,程序只能调用以泛型为返回值类型的方法;不能调用形参为泛型的方法。例如如下代码。...extends Number>也是支持协变的泛型,因此该类型的变量只能调用返回值为泛型的方法,不能调用形参为泛型的方法——如上①号代码所示。...因此对于逆变的泛型集合,程序只能向集合中添加元素——添加元素的类型总能符合上限——而集合元素总是上限的父类,因此完全没问题;但程序不能从集合中取出元素——因为编译器无法确定集合元素具体是下限的哪个父类—...对于更通用的泛型来说,对于支持逆变的泛型,程序只能调用以泛型为形参的方法;不能调用形参为返回值类型的方法(除非将返回值当成Object处理)。例如如下代码。...// 该方法的Integer参数总符合下限,下限一定派生自父类 intApp.setInfo(3); // 逆变的泛型,调用以泛型为返回值的方法,该返回值只能被当成Object
的 子类 : // 类模板 继承时 , 需要具体化 类模板 // 也就是 指定 类模板 的 类型参数列表 , 将 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小..., 继承上述类模板 , 类模板子类 与 普通类子类 区别就是 , 类模板子类 需要在尖括号中指定 具体的 类型参数列表 的 数据类型 ; 此时 , 在继承时 , 被继承的 类模板 必须 声明 类型参数列表..., 将具体的泛型类型写在尖括号中 , C++ 编译器需要知道 具体的 数据类型 是什么 , 才能生成 具体的类 , 只有这样 , 将具体的数据类型固定下来 , C++ 编译器 才能知道 父类 所占的...Father 类模板 继承 类模板 时 , 也需要 指定 父类类模板 的具体 泛型类型 , 只是这个泛型类型可以是 另外一个泛型 T ; 下面的代码 是 类模板 继承 类模板的 代码 , Son2...中的 泛型 T , 与 Father 中的 T 没有任何关系 , 也就是说 Son2 中的 泛型类型 T 相当于 普通类 继承 类模板 中的 具体类型 int , Father 类中的 泛型 T 已经被覆盖掉了
在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。...泛型方法 泛型类是在实例化类时指明泛型的具体类型;泛型方法是在调用方法时指明泛型的具体类型。泛型方法可以是普通方法、静态方法、抽象方法、final修饰的方法以及构造方法。...//2、只有声明了的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。 //3、表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。...上述这种类型的通配符也称作无界通配符,有两种应用场景: 可以使用Object类中提供的功能来实现的方法。 使用不依赖于类型参数的泛型类中的方法。 在getData中使用了?...作为通配符,但在某些场景下,需要对泛型类型实参进行上下边界的限制。如:类型实参只准传入某种类型的父类或某种类型的子类。
Java从入门到精通九(Java泛型) 泛型说明 使用泛型的好处 泛型类 泛型接口 引入类型通配符 不变,协变,逆变 用通配符支持协变和逆变(开挂行为) 泛型方法 泛型方法与可变参数 泛型上界下界 泛型数组...E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型) ?...- 表示不确定的 java 类型 这种标记符可以用在类,接口,方法中,我们可以称之为泛型类,泛型接口,泛型方法。...; import java.util.Collection; import java.util.List; //一个基本的前提:父类赋值给子类,而子类可以赋值给父类...{ ... } publicvoid show(T t) { ... } 如果再泛型类中声明了泛型方法,泛型方法使用的泛型类型T可以与类中的T不是同一种类型,也就是T不等于
常见的语法糖: 泛型与类型擦除 自动装箱与拆箱,变长参数 增强for循环 内部类与枚举类 泛型可以用在类、接口、方法中,分别称为泛型类、泛型接口、泛型方法。...extendsE>; extends关键字表示这个泛型中的参数必须是 E 或者 E 的子类。 3、下边界通配符,如 : 主要是用于第二种: 使用泛型类或者泛型方法(不推荐使用,因为这样使用会存在很多莫名奇妙的问题),如: List 表示: 泛型参数必须是E类型或者E的子类【这个只能用于方法参数,或者变量中修饰,不能修饰接口或类】 下边界通配符 表示: 泛型参数必须是E或者E的父类,直至Object类型【这个只能用于方法参数,或者变量中修饰,不能修饰接口或类】 非限定通配符: 使用一个单独的T(或者A-Z任意字母)表示,它表示没有任何的限制
一、普通函数 与 函数模板 的调用规则 - 类型匹配 1、类型匹配 上一篇博客 【C++】泛型编程 ② ( 函数模板与普通函数区别 ) 中 , 分析了 函数参数 类型匹配 下的 普通函数 与 函数模板...cout << "调用函数模板 T add(T a, T b)"<< endl; return a + b; } // 函数模板的 重载函数 // 重载是发生在 同一个作用域中 // 重写是发生在 父类...(T a, T b)"<< endl; return a + b; } // 函数模板的 重载函数 // 重载是发生在 同一个作用域中 // 重写是发生在 父类 与 子类 之间 // C++ 编译器优先...二、普通函数 与 函数模板 的调用规则 - 显式指定函数模板泛型类型 1、显式指定函数模板泛型类型 如果 函数调用时 , 显式指定函数模板类型 , 也就是在尖括号 中指定了泛型类型 , 此时 即使...<< endl; return a + b; } // 函数模板的 重载函数 // 重载是发生在 同一个作用域中 // 重写是发生在 父类 与 子类 之间 // C++ 编译器优先 调用 符合要求的
泛型指代一种参数类型,可以声明在类、方法和接口上。...public T getField() { // 类方法内也可以使用泛型类型 return field; } } 把泛型声明在方法上时: public...T>等,其实在接口中声明与在类中声明并没有什么太大区别。...实际上,实现了泛型的代码的字节码内会有一个 signature 字段,其中指向了常量表中泛型的真正类型,所以泛型的真正类型,还可以通过反射获取得到。...List 中取出来的类一定是可以转换为 Generics,所以 get 方法没问题;而具体是什么类,我们并不知道,将父类强制转换成子类可能会造成运行期错误,所以编译器不允许这种情况; 而同理 <?
领取专属 10元无门槛券
手把手带您无忧上云