泛型类、接口、方法的实际使用
类、方法示例:
/*
* 泛型类: 直接在类名后加<变量,通常为E或者T>
* 使用:创建对象时,确定类型。
*
* 泛型方法:直接在方法的返回值前定义泛型加<变量,通常为E或者T>
* 使用:调用方法时,确定数据类型。
*/
public class MyClass<E> {
private E e;
public E getE() {
return e;
}
public void setE(E e) {
this.e = e;
}
//泛型方法
public <T> void method(T a) {
System.out.println(a.toString());
}
public static void main(String[] args) {
MyClass<String> mc = new MyClass<String>();
mc.setE("abc");
System.out.println(mc.getE());
mc.method("sss");
}
}
接口示例:
/*
* 泛型接口:直接在接口名后加泛型<T>
*
* 使用:
* 1,定义类时,实现接口,此时将接口中的数据类型确定下来。 这时的类是没有泛型的,其所有类型都已经确定下来了
*
* 2,定义类时,实现接口,此时将接口中的数据类型仍然没有确定下来。 这时的类是有泛型的,其所有类型都没有确定下来了
* 该类在创建对象的时候泛型才能被确定下来
*/
public interface MyInterface<T> {
public abstract void method(T t);
}
/*
* 泛型接口的使用:
* 定义类时,实现接口,此时将接口中的数据类型确定下来。 这时的类是没有泛型的,其所有类型都已经确定下来了
*/
//public class MyInterfaceImpl implements MyInterface<String> {
//
// @Override
// public void method(String t) {
// System.out.println(t.length());
// }
//
//}
/*
* 泛型接口的使用:
* 定义类时,实现接口,此时将接口中的数据类型仍然没有确定下来。 这时的类是有泛型的,其所有类型都没有确定下来了
* 该类在创建对象的时候泛型才能被确定下来
*/
public class MyInterfaceImpl<T> implements MyInterface<T> {
@Override
public void method(T t) {
System.out.println(t);
}
public static void main(String[] args) {
MyInterfaceImpl<String> mii = new MyInterfaceImpl<String>();
mii.method("泛型 so easy!");
}
}
泛型通配符:
这里的?是限定下限,?得是ArrayList泛型E的子类才行。如果extends改为super是限定上限,泛型应是E的父类。
public ArrayList(Collection<? extends E> c)
/*
* 泛型通配符?
*
* public ArrayList(Collection<? extends E> c)
* 在上边ArrayList的构造方法中,传入一个Collection集合对象, 会将传入集合的元素,全部拷贝一份放到新建的集合中
*
* 传入参数的泛型类型,必须是我本类的泛型类型的子类
* 反之,如果是super,则表示 传入参数的泛型类型,必须是我本类的泛型类型的父类
*/
public class Demo04? {
public static void main(String[] args) {
Collection<String> c = new ArrayList<String>();
c.add("baby");
c.add("柳岩");
c.add("林允");
ArrayList<CharSequence> list = new ArrayList<CharSequence>(c);
System.out.println(list);
}
}