泛型:任意的类型
在定义类或者接口的时候 需要操作数据 但是不清楚使用者需要哪种数据
定义类、接口、变量、方法
在定义的时候可以使用泛型来代表任意的类型,但在使用的时候(定义变量、创建对象)必须传递实际类型
创建对象的时候使用变量去保存对象,这个时候变量类型需要声明具体类型 new后面可以省略
MyClass.java
import java.util.Collection
//泛型类
class Test<E>{
E var1;
}
//泛型接口
interface ITest<T>{
void test(T t);
}
//类继承一个接口时
//方法一:指定接口的类型
//class MyTest implements ITset<String>{
// @Override
// public void test(String s) {
//
// }
//}
//方法二:指定当前类为泛型
class MyTest<T> implements ITest<T>{
@Override
public void test(T t) {
}
}
//泛型方法
//必须在方法前使用<T>来表示需要使用泛型
class Foo{
public<T> void test(T t){
System.out.println(t);
}
public void showList(List<?> list){
for (int i = 0; i < list.size(); i++){
System.out.println(list.get(i));
}
}
}
//Child cd;
//Father f = cd;
//注意Java的集合类型是不会自动变型 List<Child> List<Father>
//? 通配符
//在使用一个泛型时,如果还不确定到底是什么类型,可以使用?来表示任意类型
//List<String> -> List<Object>
//设置泛型的上限 extends
class Cat{
}
interface IFood{
}
class Milk implements IFood{
}
class TianyouMilk extends Milk{
}
//指定传递过来的类型的父类必须是IFood
class Student<T extends IFood> {
public void eat(T t){
}
}
public class MyClass {
public static void main(String[] args){
}
public void t4(){
Student<Milk> xw;
Student<TianyouMilk> zs;
//Student<Cat> zt;
}
public void t3(){
//Foo foo = new Foo();
//new ArrayList<String> names = new ArrayList<>();
//names.add("jack");
//names.add("merry");
//foo.test(t: );
Foo foo = new Foo();
List<String> names = new ArrayList<>();
names.add("jack");
names.add("merry");
foo.showList(names);
}
public void t2(){
//ITest<String> test = new MyTest<>();
//使用匿名内部类对象
ITest<List<String>> test = new ITest<List<String>>() {
@Override
public void test(List<String>strings) {
}
};
}
public void t1(){
//在使用的时候(定义变量、创建对象)必须传递实际类型
Test<String> test;
new Test<String>();
//创建对象的时候使用变量去保存对象
//这个时候变量类型需要声明具体类型 new后面可以省略
Test<String> test2 = new test<>();
test2.var1 = "jack";
System.out.println(test2.var1.getClass());
}
}