您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

泛型类和泛型办法

在java学习当中,对于学习中的比较困难的地方主要集中在泛型,这篇文章主要记录一些我在泛型学习当中得到的概念和后续学习认识被推翻和重新重新创建的过程

泛型在学习的时候需要保持对一句话的理解,泛型类型在逻辑上是可以看成多个不同的类型,但在实际上其还是一个相同的基本类型

1.泛型类

泛型类在类的定义当中使用还算常见,在通过泛型的时候可以完成对一组类的操作对外开放相同接口的目的,例如在接下来几章会学习的规则集set和队列list还有映射map

常见的写法也是十分的简单,class+类名称<泛型表示(像T,?,M,E)>即可规定一个泛型类

做一个例子

package qi;

public class fanxinglei<T> {
    private T key;
    public Graxfe(T key){
        
    }
    public fanxinglei(){
        
    }
    public T getKey() {
        return key;
    }
}

注意的是,在实现泛型的时候,一定要指定T在这里面的具体类型,当然在泛型类规定的时候可以先不规定,可以直接用T,V,K什么的直接表示泛型,并没有什么问题。

在这个例子当中,key这个成员变量的类型就是T 这个类型,所以如同上一句话所说,应该做到在外部对T是什么进行一个具体的规定

在里面假如使用泛型办法,其中形参也使用T key的话,那么要注意这里也是存在key的使用类型是T,所以在外部应该规定好,但和上一条做到只规定相同的一次

public T getKey()

在这一句当中,应该要注意其中使用泛型T进行返回,所以在外部应该规定好,但和上两条做到只规定相同的一次

要注意的是,并不一定需要在做到定义泛型类就需要对其中传入一个泛型类的实参,在使用泛型之前需要注意的是,泛型并不是会直接使用的,它更重要的价值是出现在需要对一个程序进行编辑的时候使用,而且在使用了泛型实参之后,会导致这个程序在使用泛型的时候出现使用类型的限制

但假如我不对这个进行传入实参,那么只会得到一个使用泛型时方法和成员变量类型为任意类型的快乐的情况。但注意,假如我需要对这个泛型使用时进行传入限制的话,需要做到传入其实参。

Generic generic = new Generic("111111");
Generic generic1 = new Generic(4444);
Generic generic2 = new Generic(55.55);
Generic generic3 = new Generic(false);

Log.d("泛型测试","key is " + generic.getKey());
Log.d("泛型测试","key is " + generic1.getKey());
Log.d("泛型测试","key is " + generic2.getKey());
Log.d("泛型测试","key is " + generic3.getKey());

这里是一个大佬的代码,在这里可以做到对其中每一个都可以进行输出,可见如果不进行泛型实参传入的结果

2.泛型接口 

在泛型类学完之后可以得到对泛型类的基础认识,从而用到对泛型接口的使用上

可以定义一个最简单的泛型接口

//定义一个泛型接口
public interface Generator<T> {
    public T next();
}

 在这里对泛型接口的使用和普通接口相似,在得到之后可以通过重写对其中的办法进行修改

当然它还是泛型,所以我们还是需要做到对对其中T进行提前的定义,不然很容易导致其编辑器报错。但这次的和泛型类有一点不一样,这里并不需要在类的外部进行定义T这里只需要做一次这样的操作即可

class Fusjcawdcc<T> implements Generator<T>{

}

当然这个也是在没有传实参的情况,在传实参的时候可以将其中最后一个T进行改变,改变成为在接下来需要传进来数据类型的名字,举个例子

public class FruitGenerator implements Generator<String> {

    private String[] fruits = new String[]{"Apple", "Banana", "Pear"};

    @Override
    public String next() {
        Random rand = new Random();
        return fruits[rand.nextInt(3)];
    }
}

类似这个样子就可以。

接下来有一个困扰我一段时间的问题,即泛型通配符的使用,在正常情况下,我们知道Integer是number的一个子类,但在泛型中可以得知Generic<Ingeger>并不可以看做是和Generic<number>存在什么父子关系。但在泛型通配符当中存在一个特殊的符号?,在使用?的时候可以看做是对泛型的父类进行使用,这里的关系有一点像Object和number。所以在理论上,可以在不知道使用什么数据类型的时候使用?进行代替使用。

最后的是泛型办法这个在学习的过程中出现了很多差错,现在也并不可以说是没有问题,希望各位大佬在评论中指出相关的问题

 在泛型办法使用的时候,时常出现这样的问题,可能出现对于其办法无法正常使用,或者没有使用上泛型,需要注意的更多是泛型办法的开始,举个例子

public static <E> void printArray(E[] inputArray) 

类似这种,可以将其进行拆分,在泛型办法当中应该具有的是以下几个特点 在所有的泛型办法声明的时候,都需要一个类型参数,这里是使用方括号返回其需要的类型(这里的返回类型是<E>)

每一个类型的识别参数部分包含了一个或者多个类型的参数,在使用的时候可以用,进行分开,这里只有一个返回类型参数

类型参数可用于声明返回类型,并作为传递给通用方法的参数类型的占位符,这些参数被称为实际类型参数。
将一个泛型方法体声明为任何其他方法。请注意,类型参数只能表示引用类型,而不是原始类型(如intdoublechar)。(我的理解是基本上只可以使用void解决)。

 


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进