/**
* 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);
}
}
网友评论