package Genericity;
public class Test {
public static void main(String[] args) {
A a1 = new A(); //在new A的对象指定泛型的类型string
a1.setKey(“xxxx”); //对象使用sexKey(σ key)方法, 中的ey形参就是String
a1.getKey();//T getKey(), 返回值就有new对象确定返回值是string
//同样的类,但是在new对象时泛型指定不同的数据类型,这些对象不能互相赋值
A a2 = new A();
}
}
/**
-
泛型定义
-
自定义泛型类
- @param 可以随意起名一般使用大写
-
一般使用T 意type
*/
class A {
private T key;
public void setKey(T key){
this.key=key;
}
public T getKey (){
return this.key;
}
}
package Genericity;
public class Test2 {
public static void main(String[] args) {
// B1 b1 = new B1(); //接口没有声明泛型实例的时候需要声明
// B2 b2 = new B2(); // 接口声明过泛型实例的时候就不需要声明了
Cc c = new Cc();
//泛型方法,在调用之前没有固定的数据类型
//在调用时,传入的参数是什么类型,就会把泛型改成什么类型
c.test(“Xxxx”);
c.test1(2); //传递的参数是Integer,泛型就固定成Integer, 返回值就是Integer
c.test1(true);
}
}
interface IB {
T test(T t);
}
/**
-
未传入泛型实参时,与泛型类的定义相同,
-
在声明类的时候,需将泛型的声明也一起加到类中
-
@param
*/
class B1 implements IB {@Override
public T test(T t) {
return t;
}
}
/**
-
如果实现接口时指定接口的泛型的具体数据类型
-
这个类实现接口所有方法的位置都要泛型替换实际的具体数据类型
*/
class B2 implements IB {@Override
public String test(String t) {
return t;
}
}
/**
-
泛型方法定义
*/
class Cc {
private E e ;
public static void test3(T t){
//在静态方法中,不能使用类定义泛型,如果要使用泛型,只能使用静态方法自己定义的泛型
System.out.println(t);
}public void test (T s){ //无返回值的泛型方法
//在类上定义的泛型,可以在普通的方法中使用
System.out.println(this.e);
T t = s;
}
public T test1 (T s){ // 有返回值的泛型方法
return s;
}
public void test2 (T… t){ //可变参数的泛型方法
for(T tt : t){
System.out.println(tt);
}
}
}
package Genericity;
import java.util.ArrayList;
import java.util.List;
public class Test3 {
public static void main(String[] args) {
Dd d = new Dd();
d.test(new ArrayList());
d.test(new ArrayList());
//extends 的
d.test1(new ArrayList());
d.test1(new ArrayList());
//super的
d.test2(new ArrayList());
d.test2(new ArrayList());
d.test2(new ArrayList());
//IAimpl IA 接口
d.test3(new ArrayList());
}
}
class Dd {
public void test (List<?> list){ //test方法需要一个1ist集合的参数,不确定Iist集合到底是存的数的类型是什么
}
public void test1(List<? extends C1> list){//list参数的元素数据类型是c1及其子类
}
public void test2(List<? super C1> list){//list参数的元素数据类型是c1及其父类
}
public void test3(List<? extends IAimpl > list){ //list参数的元素数据类型是IA的实现类
}
}
class A1{}
class B11 extends A1{}
class C1 extends B11{}
class D1 extends C1{}
interface IA{}
class IAimpl implements IA {
}