写这篇文章其实也没什么别的 就是用来记录一下自己对泛型的一些理解 一是为了方便日后查看,二来也能给别人提供一些帮助吧 ~ 泛型的缘来跟用处我就不在这里一一细说了,在我看来就是为了规范,提供了很好的自动封箱跟拆箱,在后面的开发中也是很便利的。但是其实呢,根本不存在泛型数组这种说法的,我们经常用的数组,也是采用了Object[]作为接受数据类型的底层,然后在我们去取的时候做了强制类型转化。
先上代码说一下泛型类,以及继承泛型类的一些注意点
/**
* 抽象泛型父类
* @author Administrator
*1,子类中泛型的定义需>=父类中的泛型
*2,泛型类中定义的方法的中如果采用了泛型的话,实现时是跟父类的
* @param <T>
*/
public abstract class Result<T> {
T result;
public abstract void test (T t);
}
//子类在声明时指定了父类中的泛型的类型
class ChineseResult extends Result<String>{
@Override
public void test(String t) {
}
}
//子类直接继承了泛型
class EnglishResult<T> extends Result<T>{
@Override
public void test(T t) {
}
}
//子类中对泛型的定义需>=父类中的泛型
class MathResult<T,T2> extends Result<T>{
@Override
public void test(T t) {
}
}
//子类父类都不指定类型。默认为object类型
class NaturalResult extends Result{
@Override
public void test(Object t) {
}
}
//报错。子类实现泛型,父类不指定。称为泛型的擦除
class ScienticeResult<T> extends Result{
@Override
public void test(Object t) {
}
}
//报错。不存在子类擦除,父类不擦除的情况
class PhycicsResult extends Result<T>{
@Override
public void test(module_src.project.cn.jt.project3.T t) {
}
}
上面的代码中就讲述了对于泛型类以及继承泛型类的一些注意点
接下来让我们来看看泛型接口的一些
package module_src.project.cn.jt.project3;
public interface ITeach<T> {
void teach(T t);
}
/**
* 子类实现泛型接口,并在接口中声明
* @author Administrator
*
*/
class English implements ITeach<String>{
@Override
public void teach(String t) {
}
}
/**
* 子类实现泛型接口,子类中泛型的定义>=接口中的泛型
* @author Administrator
*
*/
class YuWen<T,T1> implements ITeach<T>{
@Override
public void teach(T t) {
}
}
/**
* 子类实现泛型接口,接口不指定具体类型,擦除,但是接口中的泛型变量为object类型
* @author Administrator
*
*/
class Math<T> implements ITeach{
@Override
public void teach(Object t) {
}
}
/**
* 子类实现泛型接口,接口,子类均不指定具体类型
* @author Administrator
*
*/
class Scientist implements ITeach{
@Override
public void teach(Object t) {
}
}
/**
* 子类实现擦除,接口实现,错误
* @author Administrator
*
*/
class Program implements ITeach<T>{
}
仔细一对比,其实泛型类跟泛型接口的使用都是差不多的,都是父类中定义好的方法是随父类中的类型的。没指定时均为object类型。泛型中不能使用基本数据类型作为泛型。也就是说如果你想要指定类型为Int类型的话 只能指定为Integer,再去拆箱。关于泛型的类跟接口就先说这么多。希望有人能够指出其中的不足,下次再说一下泛型数组。