zoukankan      html  css  js  c++  java
  • 泛型1

    面向对象的语言的特性之一是代码的重用,而支持代码重用的一个重要的机制是泛型机制。如果在操作一个方法时可以不去考虑对象的基本类型,方法的内在逻辑相同时可以用泛型实现来描述这个方法。

    一,使用Object表示泛型:可以使用像Object这样适当的超类来实现泛型。如:

    public class Test{

      public Object read(){

        return storedValue;

      }

      public void write(Object x){

        storedValue = x;

      }

      private Object storedValue;

    }

    其中需注意两个细节:1,在使用write方法把一个Object或者其子类写入后,此时用read()方法读出的类型是Object类,若要读出写入的类型或者运用写入类型的方法时则需进行强制转化。2,不能使用基本类型作为参数,因为基本类型与Object类型不能相容,若要使用基本类型,则需使用其包装类。如:

    public class TestDemo{

      public static void main( String[  ] args){

        Test test = new Test();

        test.write( new Integer( 18 ) ); 

        Integer digital = ( Integer) test.read();

        int val = digital.intValue();

        System.out,println(" Contents are: " + val );

      }

    }

    在这个例子中因为在调用write()方法前要先创建Integer对象所以代码写的很麻烦,在Java 5 以前若一个int类型的数据放到需要Integer对象的地方那么编译会出错,而在Java 5 加入的自动装箱和自动拆箱矫正了这个情形,如果将一个基本类型的变量放入需要使用包装类的地方,编译器将自动调用相对应的包装类的构造方法,这就叫做自动装箱。如果将一个包装类插入到需要基本类型的地方,编译器会调用包装类中取出基本类型值的方法,这叫做自动拆箱。(但在对泛型类的实例化时不能使用基本类型。)

    代码修改为:

    public class TestDemo{

      public static void main( String[  ] args){

        Test test = new Test();

        test.write( 18 );

        System.out,println(" Contents are: " + test.read() );

      }

    }

    二:使用接口类型表示泛型

    一般只有在使用Object这样的超类中所定义的方法可以标示所执行的操作时才使用Object这样的超类作为泛型类型,例如需要在一些项中找出最大项的问题,这与项的类型无关,但它需要一种能力来比较任意两个对象,并能确定哪个大哪个小。可以使用compareTo方法。它对所有的Comparable接口都是现成可用的,方法可以写为:

    public class FindMaxDemo{

      public static Comparable findMax( Comparable [ ] compare){

        int maxIndex = 0;

        for ( int i = 0 ; i < compare.length; i++ ){

          if (compare[maxIndex].compareTo[i] <  0){

            maxIndex = i;

          }

        }   

        return compare[maxIndex];

      }

    }

    如果使用这个方法找出最大项时首先需要注意,所传入的数组元素必须实现Comparable接口,即使一个元素具有compareTo方法,但并未实现Comparable接口也不能作为数组元素传入。

    其次数组中的对象必须相容,否则compareTo方法会抛出ClassCastException。

    注意基本类型不能作为Comparable进行传入,而包装类可以,因为包装类实现了Comparable接口。

    注意接口作为泛型时可以使用自定义的接口,不一定需要使用标准的接口库。

    最后,使用接口表示泛型并不一定总是行得通,例如有的类是库中的类,而接口是自定义的,这时无法宣称该类实现了接口。

  • 相关阅读:
    如何最大限度提高.NET的性能
    Webserivce简单安全验证
    一些NLP相关的JD,作参考
    拼多多的故事
    storm的一些相关文章
    这篇文章不错,仔细读读,码农晋升为技术管理者后,痛并快乐着的纠结内心
    protobuf的反射机制
    如何清理Docker占用的磁盘空间?
    经典面试题:浏览器是怎样解析CSS的?
    代码编辑器横评:为什么 VS Code 能拔得头筹
  • 原文地址:https://www.cnblogs.com/asiastic-wormwood/p/8435947.html
Copyright © 2011-2022 走看看