package generics;//泛型class Point { private T x; private T y; public T getX() { return x; } public void setX(T x) { this.x = x; } public T getY() { return y; } public void setY(T y) { this.y = y; } @Override public String toString() { return "Point [x=" + x + ", y=" + y + "]"; }}public class Test { public static void main(String[] args) { Point point = new Point (); point.setX("qwe"); point.setY("asd"); System.out.println(point); Point point2 = new Point<>();//1.7后new后可以不写类型 point2.setX(12); point2.setY(23); System.out.println(point2); }}
三、通配符
引出:解决参数统一问题,可以接收所有的泛型类型,又不能让用户(main)直接修改,使用通配符
?用于方法参数,指代任意类型
eg:fun(MyClass<?> myclass) //表示可以接收任意类型的MyClass对象
由于类型无法确定,所以只能取得值,不能修改
?extend 类 :设置泛型上限,可用于类或方法参数
eg:?extend Number:表示只能接收Number或其子类
用于方法参数时,只能取得值不能修改(类型无法确定)
?super 类 :设置泛型下限,只能用于方法参数
?super String :表示只能接收String或其父类(Object)
可以修改值,类型已确定,自己或父类,若此时?为父类,会默认发生向上转型
应用:
package generics;//通配符class MyClass { private T value; public MyClass(T value) { super(); this.value = value; } public T getValue() { return value; } public void setValue(T value) { this.value = value; }}public class Test1 { public static void main(String[] args) {// fun(new MyClass (10)); fun(new MyClass ("qwe")); MyClass myClass = new MyClass<>("123"); MyClass myClass1 = new MyClass ("123"); fun(myClass); // fun(new MyClass (10.2)); fun(new MyClass