class Demo<T> {
T x;
public Demo(T x) {
this.x = x;
}
public T getX() {
return x;
}
}
public class Test {
public static void main(String[] args) {
Demo<String> demo = new Demo<>("SSS");
String str = demo.x;
System.out.println(str);
}
}
反编译后:
class Demo
{
Object x;
public Demo(Object x)
{
this.x = x;
}
public Object getX()
{
return x;
}
}
public class Test
{
public Test()
{
}
public static void main(String args[])
{
Demo demo = new Demo("SSS");
String str = (String)demo.x;
System.out.println(str);
}
}
泛型类和泛型方法
(1)泛型类
在类上面定义的泛型,class 类名
{},在创建对象的时候,要指明泛型的类型。
泛型类当中定义的泛型只能用在普通方法上面,不能使用在静态方法上面。
(2)泛型方法
就是在方法上面添加了泛型,是在使用方法时,参数传递确定具体的类型。
方法想要单独使用泛型,必须要有参数才有意义。
class Demo {
public <T> void demo1(T t) {
System.out.println(t.getClass());
}
public <T> T demo2(T t) {
System.out.println(t.getClass());
return t;
}
public static <T> void demo3(T t) {
System.out.println(t.getClass());
}
}
public class Test {
public static void main(String[] args) {
Demo demo = new Demo();
demo.demo1("str");// class java.lang.String
demo.demo1(10);// class java.lang.Integer
demo.demo1(10.5);// class java.lang.Double
Demo.demo3(true);// class java.lang.Boolean
}
}
泛型通配符
通配符:不知道使用什么类型来接收的时候,可以使用?表示未知。
(1)无边界的通配符
无边界的通配符的主要作用就是让泛型能够接受未知类型的数据。
public static void printList(List<?> list) {
for (Object o : list) {
System.out.println(o);
}
}
public static void main(String[] args) {
List<String> l1 = new ArrayList<>();
l1.add("aa");
l1.add("bb");
l1.add("cc");
printList(l1);
List<Integer> l2 = new ArrayList<>();
l2.add(11);
l2.add(22);
l2.add(33);
printList(l2);
}