您的位置: 翼速应用 > 业内知识 > Java > 正文

聊聊Java中那些与泛型相关的问题

今天和大家来聊一下JAVA的相关问题,主要讲JAVA中的泛型,包括自定义泛型类、自定义泛型方法、自定义泛型接口等等内容,详细内容请看下文。


聊聊Java中那些与泛型相关的问题



泛型是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。泛型的格式为<数据类型>,这里注意:泛型只能支持引用数据类型,集合体系的全部接口和实现类都是支持泛型的使用的。


优点


●  统一数据类型。


●  把运行的问题提前到编译期间,避免了强制类型转换可能出现的问题,因为编译阶段类型便可以确定下来。


public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("石原里美");
        list.add("工藤静香");
        list.add("朱茵");
        for (String s : list) {
            System.out.println(s);
        }
    }
输出结果:
石原里美
工藤静香
朱茵


并且泛型还可以在很多地方进行定义,比如在类后面就是泛型类、方法声明上就是泛型方法、接口后面就是泛型接口。接下来我们共同来学习一下这些泛型是如何使用的:


自定义泛型类


自定义泛型类之概念


●  定义类的同时定义了泛型的类就是泛型类。


●  泛型类的格式:修饰符 class 类名<泛型变量> { }

public class MyArrayList<E>{    }


●  作用:编译阶段可以指定数据类型,类似于集合的作用


实战教学


现创建一个泛型类,实现基本的增加、删除操作,以此来具体了解其用法:


//泛型类MyArrayLIst
public class MyArrayLIst<E> {
    public void add(E e){
 
    }
    public void remove(E e){
 
    }
}
//main
public static void main(String[] args) {
        MyArrayLIst<String> list = new MyArrayLIst<>();
        //通过对泛型的设定,实现对数据专一处理
        list.add("石原里美");
        list.add("工藤静香");
        list.remove("工藤静香");
    }


泛型类的原理:


把出现泛型变量的地方全部替换成传输的真实的数据类型。


通过认真观察,其实不难去发现,泛型类与普通类的最大区别在于在调用方法的时候可以统一的对同一种数据进行处理,不会涉及到其他的数据类型,从一定程度上避免了强制类型转化时可能会出现的问题。


泛型类的原理


自定义泛型方法


概念


●  定义方法的同时定义了泛型的方法就是泛型方法。


●  泛型方法的格式:修饰符<泛型变量> 返回值类型 方法名(形参列表){ }

public <E> void view(E e){    }


●  作用:方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性。


●  注意:泛型方法需要区别于泛型类中所定义的方法,虽然它们也在使用泛型,但是该泛型不是其定义的,而是泛型类定义的。


实战教学


无论传入何种类型的数组,都可以返回它的内容,即实现Arrays.toString()的作用


public static void main(String[] args) {
        String [] name = {"石原里美","工藤静香","朱茵"};
        view(name);
        Integer [] age = {18,19,20};
        view(age);
    }
    public static  <T> void view(T[] arr){
        StringBuilder list = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            list.append(arr[i]).append("\t");
        }
        System.out.println(list);
    }


通过实现对泛型方法的定义,可以实现多种数据类型的接收,应用范围更加广泛。


自定义泛型接口


概念


●  使用泛型定义的接口就是泛型接口。


●  泛型接口的格式:public interface People<E>{ }

public interface People <E>{    }


●  作用:泛型接口可以让实现类选择当前功能需要操作的数据类型


实战教学


定义一个People接口,实现对老师Teacher类、学生Student等类的操作


//People接口
public interface People <E>{
    void run(E e);
    void height(E e);
}
//Student类
public class Teacher {
 
}
//实现类Fantype
public class Fantype implements People<Teacher> {
 
    @Override
    public void run(Teacher teacher) {
 
    }
 
    @Override
    public void height(Teacher teacher) {
 
    }
}


通过对上述代码的观察,可以发现,People后定义的是什么类型,那么该实现类只能对该种数据类型进行操作,其他类型不可以进行此操作。


通配符和上下限


通配符


●  ?可以在“使用泛型”的时候代表一切类型


●  E T K V是在定义泛型的时候用的


假设现在有一场为学生和老师而举办的比赛,需要比较速度究竟谁更快,分别创建一定数量的对象并将其传入集合之中。然而当我们将这两个集合分别传入方法中的时候,会发现,学生对象集合list2出现报错,为什么呢?原因是因为数据类型不同,那么该如何使得两种类型都可以传入呢?或许这个时候就会有人说了:“既然两个类都是People的子类,那么为什么不定义它的泛型是People呢?”这个想法很好,但是我们需要明确一点的是子类与父类虽然是有关系的,但是定义之后的集合是没有关系的,所以这里是行不通的。


//main
//老师对象集合
ArrayList<Teacher> list1 = new ArrayList<>();
list1.add(new Teacher());
list1.add(new Teacher());
pk(list1);
//学生对象集合
ArrayList<Student> list2 = new ArrayList<>();
list2.add(new student());
list2.add(new student());
pk(list2);//由于pk方法的形参是泛型为Teacher的集合,所以会报错
//父类
class People{
 
    }
//子类
class Teacher extends People{
 
    }
class student extends People{
 
    }
//pk方法:
public static void pk(ArrayList<Teacher> people){
}


应对这个问题,我们可以便可以将本篇文章引入的知识“通配符”放在实际应用中解决问题了,通过其简短的概念“?可以在‘使用泛型’的时候代表一切类型”就可以理解其作用了,这里我们可以使用“?”共同代表两种类型。


public static void pk(ArrayList<?> people){
//通过通配符?便可以将这个问题解决掉
    }


上下限


然而此时又出现一个问题,定义了一个dog类,试图创建一些对象并传入集合中混入比赛,这种当然情况当然是不允许发生的,然而?是可以表示任意类型的,并不能对其进行限制。因此上下限的作用就体现出来了:


●  上限:<? extends 父类>,传入类型必须是该父类或者是父类的子类


●  下限:<? super 子类>,传入类型必须是该子类或者是子类的父类


public static void pk(ArrayList<? extends People> people){
//通过上下限便可以将这个问题解决掉
//要求传入的类型必须是People的子类才可以
    }



我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题