美文网首页
2019-10-12:1_5

2019-10-12:1_5

作者: RedAlert3 | 来源:发表于2019-10-12 00:56 被阅读0次

    /**

    * java5支持泛型类

    *

    * 简单的泛型类和接口

    */

    public class p1_5_1

    {

    /**

        * 当指定一个泛型类时,类的声明包含一个或多个类型参数,这些参数被放在类名后面的一个<>内.

        * 也可声明泛型接口.

    */

        GenericMemoryCellcell1=new GenericMemoryCell<>();

    GenericMemoryCellcell2=new GenericMemoryCell<>();

    }

    /**

    * 自动拆装箱

    *

    * 如果一个int型量被传递到需要一个integer对象地方,编译器将在幕后插入一个对integer构造方法的调用——自动装箱.

    * 如果一个integer对象被放到需要int型量的地方,编译器将在幕后插入一个对intValue方法调用——自动拆箱.

    */

    public class p1_5_2

    {

    public static void main(String[] args)

    {

    GenericMemoryCell cell=new GenericMemoryCell<>();

    cell.write(37);

    int val=cell.read();

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

    }

    }

    /**

    * 带有限制的通配符

    *

    * 因为使用泛型的全部原因就在于产生'编译器错误'而不是类型不匹配的运行时异常,所以泛型集合不是协变.

    * Collection<Rectangle> IS-N-A Collection<Shape> * java5用通配符(wildcard)来避免泛型集合不是协变带来的代码缺少灵活性.

    */

    public class p1_5_3

    {

    public static int totalArea(Collection shapes)

    {

    int area=0;

    for(Shape shape:shapes)

    {

    area+=shape.area;

    }

    return area;

    }

    public static int totalArea2(Collection shapes)

    {

    int area=0;

    for(Shape shape:shapes)

    {

    area+=shape.area;

    }

    return area;

    }

    public static void main(String[] args)

    {

    Collection list=new ArrayList<>();

    list.add(new Rectangle(1));

    int area=0;

    //        area=totalArea(list); //编译不通过

            area=totalArea2(list);

    System.out.println("area:"+area);

    }

    }

    /**

    * 泛型static方法

    *

    * 从某种意义来说p1_5_4.totalArea2是泛型方法,因为他能接受不同类型参数.

    * 但是这里没有特定类型的参数表,正如GenericMermoryCell<AnyType>声明一样,有时候特定类型很重要:

    * 1.该特定类型用作返回类型;

    * 2.该类型用在多于一个的参数类型中;

    * 3.该类型用于声明一个局部变量.

    * 如果这样,那么有必要声明一种带有若干类型参数的显示泛型方法.

    */

    public class p1_5_4

    {

    //泛型方法类似泛型类,因为类型参数使用相同语法.

        // 在泛型方法中的类型参数位于返回类型之前.

        public static boolean contains(Shape[] shapes,Shape shape)

    {

    for(Shape shape0:shapes)

    {

    if(shape0!=null&&shape0.equals(shape))return true;

    }

    return false;

    }

    }

    public class p1_5_5

    {

    public static IShape findMax0(IShape[] shapes)

    {

    int maxIndex=0;

    for(int i=1;i

    {

    //          if(shapes[i].compareTo(shapes[maxIndex]))maxIndex=i;//编译器不能证明此处调用compareTo合法

            }

    return null;

    }

    public static Shape findMax1(Shape[] shapes)

    {

    int maxIndex=0;

    for(int i=1;i

    {

    if(shapes[i].compareTo(shapes[maxIndex])>0)maxIndex=i;

    }

    return shapes[maxIndex];

    }

    //better

    //not enough better?

        //假设Shape实现Comparable<Shape>,设Square继承Shape.

        //=> Square实现Comparable => Square IS-A Comparable but Square IS-N-A Comparable

        public static >Shape findMax2(Shape[] shapes)

    {

    int maxIndex=0;

    for(int i=1;i

    {

    if(shapes[i].compareTo(shapes[maxIndex])>0)maxIndex=i;

    }

    return shapes[maxIndex];

    }

    //more better

        //应该说:AnyType IS-A Comparable<T>,其中T是AnyType的父类.由于我们不惜要知道精准类型T,因此可以使用通配符.

    //

        public static >T findMax3(T[] shapes)

    {

    int maxIndex=0;

    for(int i=1;i

    {

    if(shapes[i].compareTo(shapes[maxIndex])>0)maxIndex=i;

    }

    return shapes[maxIndex];

    }

    public static void main(String[] args)

    {

    Shape[] shapes={new Rectangle(1),new Circle(2),new Square(3)};

    Shape maxShape=findMax3(shapes);

    System.out.println("maxShape:"+maxShape);

    }

    }

    相关文章

      网友评论

          本文标题:2019-10-12:1_5

          本文链接:https://www.haomeiwen.com/subject/zzsfmctx.html