`
tang9140
  • 浏览: 34570 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java泛型学习和实践(2)

 
阅读更多

引言

上节中简单介绍了泛型基本使用方法及使用泛型带来的安全性和可读性好处,接下来继续思考第二版代码的不足之处。回顾第二版Driver类的drive方法,其接收T泛型参数,为了调用具体car的run方法,需要向下转型,进行了多次instanceof判断,代码冗余且扩展性不好,不符合代码设计的"开闭原则"。有没有更好的方式?

根据“依赖反转”原则,即代码应当依赖于抽象,而不是具体。由于T类型可以是任意具体的类型,所以在方法体中只能当作一般的Object进行处理,那如果可以限制T的具体类型呢,让T类型必须是某个类的子类或实现某个接口呢,那么问题就解决了。请看改进后的代码

第三版

第三版代码如下:

public interface Runnable {
    public void run();
}
public class Buick implements Runnable {
    
    @Override
    public void run(){
        System.out.println("buick run");
    }
    
    public void autoRun(){
        System.out.println("buick auto-run");
    }
}
public class Ford implements Runnable  {
    
    @Override
    public void run(){
        System.out.println("ford run");
    }
    
    public void fly(){
        System.out.println("ford fly");
    }
}
public class Driver<T extends Runnable> {
    
    private T car;
    
    public void drive(T car){
        this.car = car;
        System.out.println("I am driving a " + car);
        car.run();
    }
    
    public T getDrivingCar(){
        return car;
    }
    
    public static void main(String[] args) {
        Driver<Ford> driver1 = new Driver<Ford>();
        driver1.drive(new Ford());
        Driver<Buick> driver2 = new Driver<Buick>();
        driver2.drive(new Buick());
        
        //...执行其它业务逻辑
        
        /** 获取司机1开的福特车执行fly方法 */
        driver1.getDrivingCar().fly();
        
        /** 获取司机2开的别克车执行autoRun方法 */
        driver2.getDrivingCar().autoRun();
        
    }
}

跟前一版本相比,增加了Runnable接口(不要跟多线程的Runnable接口混洧,如有雷同,纯属巧合),Ford和Buick都实现了该接口。最主要的修改在Driver类的泛型T声明上,将<T>改为<Textends Runnable>,这样改的意思是指,T泛型代表任意实现或继承Runnable接口的具体类型,这样就能够在方法体中直接调用Runnable接口中的run方法。

这样改的另一个好处是,由于drive方法接收的参数是基于接口的,这样即使传入参数是另外的车类型(比如奔驰车),代码也不需要进行任何修改,完全符合代码设计中“对扩展开放,对修改关闭”的原则。

泛型声明<T extends Runnable>意味着T类型必须是Runnable接口的子接口或实现类。更一般化的,可以是<T extends Parent>,Parent可以是接口,抽象类或一般类。T具体类型必须是Parent的子类或实现类或Parent自身。

上面介绍了extends关键字在泛型声明中的使用。下面介绍下如何在方法上进行泛型声明并使用。今天就写到这了,明天继续

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    java泛型学习全面页面下载资料

    这些“java泛型学习全面页面下载资料”很可能包含以下内容: 1. **泛型的基本概念**:解释了泛型是什么,以及如何通过使用尖括号`&lt;&gt;`来定义泛型类、泛型接口和泛型方法。 2. **类型参数**:介绍如何定义类型参数,...

    Java泛型编程最全总结

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了代码的类型安全性和重用性。泛型允许我们在编写类...通过深入学习和实践,我们可以更高效地利用泛型来设计和实现复杂系统。

    java 泛型入门 实例

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了代码的类型安全性和重用性。本篇文章将带你入门Java泛型,通过实例深入理解其核心概念。 1. **泛型的基本概念** - 泛型...

    java泛型的使用

    本压缩包包含了一些关于Java泛型的实例,旨在帮助学习者深入理解和应用这一特性。 泛型的主要目标是允许在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。在Java中,泛型主要体现在...

    java泛型例子

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了类型安全性和代码可读性。...对于Java泛型的例子,可以通过运行和分析压缩包中的`generic`文件来加深理解和实践。

    学士后Java集合框架和泛型课后习题答案

    通过学习和练习这些内容,你可以深入理解Java集合框架的核心概念和泛型的应用,从而在编程实践中更加灵活和高效地处理数据。同时,不断的学习和实践是提升技能的关键,希望你能在Java世界中不断进步。

    java泛型md,学习代码

    【Java 泛型】是Java编程语言中一个强大的...总之,这个压缩包包含的内容涉及了Java泛型、Java Web开发基础、以及现代Web应用中数据存储的几种方式,对于深入理解和实践Java编程,尤其是后端开发有着重要的参考价值。

    java泛型实例讲解代码.rar

    通过阅读和理解`java泛型实例讲解代码`中的代码,你可以深入学习如何在实际编程中应用这些概念,以及它们如何提升代码的健壮性和可维护性。这个压缩包可能包含了各种示例,如泛型类、泛型方法、边界限制等,通过这些...

    java集合 框架 泛型

    学习这部分内容对于Java开发者至关重要,因为理解并熟练掌握Java集合框架和泛型,能有效地提升代码质量和效率,减少运行时错误。此外,了解枚举类型有助于编写更安全、更整洁的代码。通过深入研究和实践,开发者能够...

    java io流 xml 泛型 例子学习

    Java IO流、XML和泛型是Java编程中的关键概念,对于任何Java开发者来说,理解和熟练掌握这些技术至关重要。本文将深入探讨这三个主题,并通过具体的例子进行学习。 首先,我们来看Java IO流。IO流在Java中是用来...

    myreflect.rar 反射和泛型使用源码

    Java编程语言中的反射和泛型是两个非常重要的概念,它们为开发者提供了强大的工具来操作类、接口、对象以及参数类型。在"myreflect.rar"这个压缩包中,我们可以期待找到一系列关于这两个主题的源代码示例,这将有助...

    [Java泛型和集合].(Java.Generics.and.Collections).Maurice.Naftalin&Philip.Wadler.文字版

    《Java泛型与集合》一书不仅详细介绍了泛型的基本概念和高级特性,还深入探讨了集合框架的使用方法和最佳实践。通过学习本书,读者将能够掌握Java泛型的核心技术,提高代码的质量和可维护性,同时充分利用集合框架的...

    java泛型[定义].pdf

    在Java编程语言中,泛型是一种强大的工具,它允许我们在编写代码时指定类型参数,从而提高了类型安全性和代码重用性。在Java SE 1.5及更高...学习泛型需要时间和实践,但一旦掌握,将极大地提升代码质量和开发效率。

    Java5.0泛型编程

    Java5.0泛型编程是Java开发中的一个重要里程碑,它引入了一种强大的类型系统机制,大大增强了代码的类型安全性,并减少了在编译期间和运行时...通过深入学习和实践,开发者可以编写出更加高效、安全且易于维护的代码。

    java技术之泛型的学习

    Java泛型在运行时会被类型擦除,这意味着所有的泛型信息在编译后都会消失,替换为原始类型。因此,泛型主要在编译时提供类型检查,并不改变运行时的行为。 六、泛型与反射 由于类型擦除,泛型在反射中的使用需要...

    Java泛型继承原理与用法详解

    Java泛型是自Java 5版本引入的一种强大的类型系统特性,它允许我们在编程时指定容器(如列表、集合等)所存储的数据类型。这增强了代码的类型安全性...通过不断学习和实践,我们可以更好地掌握Java泛型这一强大的工具。

    关于java泛型的小测试(wildcard,erasure,covariant,raw type)

    Java泛型是Java编程语言中的一个关键特性,它允许在定义类、接口和方法时指定类型参数,从而增强了代码的类型安全性和重用性。在本小测试中,我们将探讨几个与Java泛型相关的概念:通配符(Wildcards)、消除...

    Java-Java反射与泛型教程

    在学习Java反射和泛型时,理解它们的概念和使用场景是非常重要的。反射提供了一种动态操控程序的能力,常用于框架开发、插件系统、元数据处理等。而泛型则提高了代码的可读性和安全性,减少了类型转换的工作。结合...

    JAVA学习笔试(数据基础+泛型编程)-适合小白

    JAVA学习是每位初学者步入编程...以上就是JAVA学习笔记的主要内容,对于非计算机专业的人来说,逐步理解并实践这些知识点将有助于建立起坚实的JAVA编程基础。在学习过程中,不断练习和实际应用是巩固知识的最好方式。

    JDK 5.0中的泛型类型学习

    在本月的“Java 理论和实践”中,Brian Goetz 分析了束缚第一次使用泛型的用户的常见陷阱。您可以通过讨论论坛与作者和其他读者分享您对本文的看法。(也可以单击本文顶端或底端的讨论来访问这个论坛。)

Global site tag (gtag.js) - Google Analytics