1、泛型的定义
1.1 泛型类/泛型接口:
类名后带“<T>”,其中T是类型占位符,可自定义。

1.2 泛型方法
在方法返回值前加上"<T>",

public class FanXinDemo
{
public static void main(String[] args)
{
FanXinDemo a=new FanXinDemo();
Integer[] array={1,2,3};
a.printArray(array);
Box<String> c=new Box<>();
c.getNum("你好");
}
public <T> void printArray(T[] array)
{
System.out.println(array[1]);
}
}
class Box<T>
{
T b;
public void getNum(T b)
{
this.b=b;
System.out.println(b);
}
}
//输出 2
//你好
注意,java的泛型不支持基本数据类型,支持String类和包装类。
2、泛型的作用
2.1 数据类型参数化
即数据类型如String、Integer用类型占位符T代替。在定义类、接口、方法时先不定义具体的数据类型,待到使用时再定义。
2.2 类型安全
泛型就相当于给代码贴标签。有泛型之前,集合、数组里什么类型的数据都能装,但是在取出时要面临类型转换的问题,容易出错,比如存进去一个字符串“小狗”,又存一个整数200,按索引取数据时对应数据的类型容易填错导致报错。


3. 泛型类和普通类
3.1 首先看创建泛型类的实例
class MyStack<T>
{
private static final int STACK_CAPACITY=3;
private T[] myStack;
int top; //栈顶索引
// int size;
@SuppressWarnings("unchecked")
public MyStack()
{
myStack=(T[]) new Object[STACK_CAPACITY];
// myStack[++top]=data;
top=-1;
}
public void push(T data) //入栈
{
if(top==myStack.length-1)
{
// throw new IndexOutOfBoundsException("栈已满,无可进空间");
resize(2*STACK_CAPACITY);
}
myStack[++top]=data;
}
public T pop() //出栈
{
if(top==-1)
{
throw new IndexOutOfBoundsException("栈已空,无可出元素");
}
T peek=myStack[top];
myStack[top--]=null;
if(top>0 && top==myStack.length/4)
{
resize(myStack.length/2);
}
return peek;
}
public int getSize() //获取栈元素数量
{
return top+1;
}
public T getElement() //获取栈顶元素
{
if(top==-1)
{
throw new IndexOutOfBoundsException("栈已空,无可出元素");
}
return myStack[top];
}
@SuppressWarnings("unchecked") //注解抑制在创建泛型数组时的java警告
//也可以使用ArrayList,支持泛型类,同时也是java的动态数组
public void resize(int capacity)
{
if(capacity>STACK_CAPACITY)
{
T[] newStack=(T[]) new Object[capacity];
for(int i=0;i<top;i++)
{
newStack[i]=myStack[i];
}
myStack=newStack;
}
else
{
System.out.println("输入大小不合法:小于原来容量");
}
}
}
3.2 创建普通类的实例
class person
{
String name;
int age;
public person(String name,int age)
{
this.name=name;
this.age=age;
}
public String talk()
{
return "我是:"+this.name+",今年"+this.age+"岁了。";
}
}
前者在声明的属性类型(引用类型)、构造函数(是使用new关键字创建数组)是最大的不同。
4. 有关问题
4.1 关于<>时有时无
public Node(T data)
{
this.data=data;
this.next=null;
}
Node<T> newNode = new Node<>(data);
为什么构造函数里Node(T data)没有<>,然而在实例化时又带上了<>?
java语法规范:在类的内部成员里(比如构造函数、方法),<T>可以不带,因为泛型参数已经在泛型类定义的时候声明了。
506

被折叠的 条评论
为什么被折叠?



