java泛型的问题:在静态方法中为什么不能

Python012

java泛型的问题:在静态方法中为什么不能,第1张

你好,我觉得最主要的原因是因为泛型擦除。

class Demo<T>{

public void add(T t) {

//...

}

}

编译后通过反编译:

D:\test>javap -s -p Demo

Compiled from "Demo.java"

public class Demo extends java.lang.Object{

public Demo()

Signature: ()V

public void add(java.lang.Object)

Signature: (Ljava/lang/Object)V

}

所以,非静态方法正是由于需要先有对象,进而在使用泛型的时候可以确定安全检查的限制条件。

Demo<String>d = new Demo<String>()

d.add("str") //这里你就只能添加String类型的。

而静态方法不需要构件对象,所以他在调用方法是,根本没有判断参数的约束条件,所以虚拟机压根就不希望这种事情发生,所以在编译时就报错了。

泛型。规定了此集合中元素的类型。例如:\x0d\x0a\x0d\x0aArrayList arr = new ArrayList ()\x0d\x0a\x0d\x0a这样就创建了一个包含整数的 ArrayList 对象。\x0d\x0a如果要自己定义泛型类,就用如下形式:\x0d\x0a\x0d\x0aclass MyCollection {...}\x0d\x0a\x0d\x0a尖括号中的类型可以有限制,例如你需要让 MyCollection 中的类型都具有可比性,可以用如下格式:\x0d\x0a\x0d\x0aclass MyCollection {...}\x0d\x0a\x0d\x0a此外,要注意泛型的一些特性:\x0d\x0a\x0d\x0a1. 不能直接创建泛型数组。如 new ArrayList[5] 之类的是错的。只能用如下方法:new ArrayList[5] 或者 (ArrayList[])new ArrayList[5]\x0d\x0a\x0d\x0a2. 静态方法中需要小心,因为 E 一般是非静态类型,如果你这样写:\x0d\x0a class MyCollection {\x0d\x0a public static MyCollection abc() {\x0d\x0a ......\x0d\x0a }\x0d\x0a }\x0d\x0a 是错的。你只能把 去掉。