[code="java"]
public List getValues(Class c) throws Exception{
List values = new ArrayList();
T o= c.newInstance();
values.add(o);
return values;
}
[/code]
这个是从一个类文件拷出来的代码
List 为什么要这样写
我感觉[code="java"]
public List getValues(Class c) throws Exception{
List values = new ArrayList();
T o= c.newInstance();
values.add(o);
return values;
}
[/code]
这样写就是正确的
事实拷出来的代码在新的类里确实正常
关键是在原类会报错
Multiple markers at this line
- T cannot be resolved to a type
- T cannot be resolved to a type
--Eclipse 提示
非常不理解 为什么
[quote]
List 与List的区别
[/quote]
我还没说清楚吗?你不要把这两个一起比较,虽然形式上很像,但它们是两个语法类型。比较下面两个声明:
[code="java"]
public List getValues(Class c) throws Exception{
List values = new ArrayList();
T o= c.newInstance();
values.add(o);
return values;
}
public void getValues2(Class c) throws Exception{
List values = new ArrayList();
T o= c.newInstance();
values.add(o);
}
[/code]
上面的“ List”和“ void”才具有可比性,从上面可以看出表示声明泛型方法,是语法的一部分,“List”或“void”表示方法的返回类型。至于List,我想你应该知道是什么含义了,就是泛型类的语法方式。
另外,上面这两方法可以放到任何普通类里面,不会出现任何问题。但要注意使用JDK 5及以上,还有一点,Eclipse里的编译器是可以设置JDK级别的,即使是JDK5,也可以设置为1.4的级别,所以,不要光看是相同的JDK,还要看使用编译器的级别。
这是java泛型的语法啊,用之前必须在方法前定义!
[code="java"]
class A {
public <T>List<T> getValues(Class<T> c) throws Exception{
List<T> values = new ArrayList<T>();
T o= c.newInstance();
values.add(o);
return values;
}
public List<T> getValues2(Class<T> c) throws Exception{
List<T> values = new ArrayList<T>();
T o= c.newInstance();
values.add(o);
return values;
}
}
[/code]
像这样定义,两个都是正确的。你说的
[quote]
Multiple markers at this line
在方法这里用泛型,得在返回类型前加这个符号
可以看看thinking in java
在你没有返回值的时候,可以不用在前面定义,将方法里的改为<?>就可以了,但是这样一般没有多大意义
泛型就是你可以传入任何值,这和Object很像,不过你可以限制T的类型,比如
[code="java"]
class A {
public List getValues2(Class c) throws Exception{
List values = new ArrayList();
T o= c.newInstance();
values.add(o);
return values;
}
}
[/code]
上面这种是“generics class”,即针对类的泛型声明,泛型参数T在类的声明范围内有效。
[code="java"]
public List getValues(Class c) throws Exception{
List values = new ArrayList();
T o= c.newInstance();
values.add(o);
return values;
}
[/code]
而这种是“generics method”,即泛型方法,“List”是可以中间分开的,写出“ List”,这样会更清楚,这个参数T则在此方法声明范围内有效。
所以,对于泛型类中,如果没有了参数T,那么里面的方法却包含T,就会出现编译期的错误:
[quote]
[code="java"]
Multiple markers at this line