1.泛型类java
public class Dog<T> { private T age; public Dog(T age) { this.age = age; } public T getAge() { return age; } public static void main(String[] args) { //Java7以后,尖括号中是不须要填写参数的 Dog<String> dog=new Dog<>("28"); System.out.println(dog.getAge()); } }
普通的类安全
public class Dog { private Object age; public Dog(Object age) { this.age = age; } public Object getAge() { return age; } public static void main(String[] args) { Dog dog=new Dog("28"); System.out.println(dog.getAge()); } }
这样的代码是彻底能够执行了,那为何还须要泛型类?app
1.安全性ide
public class Dog { private Object age; public Dog(Object age) { this.age = age; } public Object getAge() { return age; } public static void main(String[] args) { Dog dog=new Dog("28"); Integer age=(Integer) dog.getAge(); System.out.println(age); } }
上面的代码编译是彻底能够经过的,可是执行的时候就会出现ClassCastException异常
2.可读性好,省去了反复的强制类型转换。测试
对于泛型类,java编译器会将泛型代码转换成普通的非泛型代码,ui
因此对于虚拟机来讲,是没有泛型类的概念的。
为何这么设计呢?应为泛型是jdk6之后才有的,为了向下兼容。this
泛型方法:spa
public class TestMethod { public static <T> boolean isHas(T[] arr, T elemt){ for(T t:arr){ if(t.equals(elemt)){ return true; } } return false; } public <S> boolean isString(S s){ if(s instanceof String){ return true; } return false; } public static void main(String[] args) { Integer[] arr={1,5,6,8}; System.out.println(isHas(arr,8)); TestMethod testMethod=new TestMethod(); System.out.println(testMethod.isString(5)); } }
一个方法是否是泛型和他的类是否是泛型没有任何关系。
泛型方法须要在方法的返回值前先声明,在从后面的代码中使用。设计
泛型接口:
参照Comparable接口。code
public class TestComparable implements MyComparable<TestComparable>{ private Integer n; public TestComparable(int n) { this.n = n; } @Override public boolean isEquals(TestComparable testComparable) { return this.n.intValue()==testComparable.getN().intValue()?true:false; } public Integer getN() { return n; } public static void main(String[] args) { TestComparable testComparable1=new TestComparable(2); TestComparable testComparable2=new TestComparable(2); System.out.println(testComparable1.isEquals(testComparable2)); } } interface MyComparable<T> { boolean isEquals(T t); }
类型参数继承某个类
/** * 测试继承class */ public class TestInheritClass<T extends Father>{ private T t; public TestInheritClass(T t) { this.t = t; } void output(){ System.out.println(t.getName()); } public static void main(String[] args) { Child child=new Child("李逵"); TestInheritClass<Child> t=new TestInheritClass<>(child); t.output(); } } class Father{ private String name; public String getName() { return name; } public Father(String name) { this.name = name; } } class Child extends Father{ public Child(String name) { super(name); } }
测试继承接口
/** * 测试继承接口 */ public class TestInheritInterface<T extends IFruits> { private T t; public TestInheritInterface(T t) { this.t = t; } void output(){ t.shape(); } public static void main(String[] args) { Apple apple=new Apple(); TestInheritInterface<Apple> t=new TestInheritInterface<>(apple); t.output(); } } interface IFruits{ //形状 void shape(); } class Apple implements IFruits{ @Override public void shape() { System.out.println("苹果是圆形的。"); } }