日期:2014-05-20  浏览次数:20724 次

java 泛型怎么那么奇怪? 求指点
java 泛型不太懂 
比如:

public <T> void func() {}

这里 既然都 void 了, 为什么还要 <T> 
为什么不是 
public void func() {}

还有

public <T> T naiveCast(T t, Object o) {
  return (T) o; 
}

这里的 <T> T 甚是疑惑 要么 <T> 或者 T 即可. 如:

public <T> naiveCast(T t, Object o) {
  return (T)o;
}


public T naiveCast(T t, Object o) {
  return (T)o;
}


热心人指点一下.
有关java泛型易错需要注意的地方也帮忙指出来, 谢谢! 
java

------解决方案--------------------
引用:
引用:public <T> void func( T t) {} 中的<T>的意思是这个func()方法要接收一个不知道是什么类型的引用型数据,而<T>就是用来接收你要传递的参数的类型是什么,而不是你说的返回值。举个例子:
public <String>void func(String t) 这里的String类型就是上面对应的T……


public class TypeName<T> { ... } 
这里的 <T> 是泛型类型的声明,或者叫形式类型参数,这里声明的 T 就可以在 TypeName 类的所有非静态环境里使用。
使用者的代码是象这样的 : TypeName<String> strType;


public <T> void method(T param);
这里的 <T> 同样是泛型类型的声明,跟前面那个没有什么不同,唯一的区别是作用范围: 这里生命的 T 只能在 method 方法内使用。
使用者的代码是象这样的: obj.<String>method("param");
------解决方案--------------------
1、自定义泛型方法:先写public void test1(T t),由于java中要先声明后使用,所以要在方法前面加上<T> ,即是public <T> T test1(T t)
public class Geric {
public <T> T test1(T t){
return t;
}
public <T,K> void test2(T t,K k){
}
}


2、自定义泛型类:在类定义了泛型后就不用在方法中再定义了,但静态方法还是要先定义
public class Geric<T> {
public T test1(T t){
return t;
}
public <K> void test2(T t,K k){

}
public static <T,K,E> void test3(T t,K k,E e){

}
}

如你楼主的public <T> T naiveCast(T t, Object o) {  return (T) o; }
这里 <T> 代表是你用来先声明T的,而T代表函数的返回类型,如果去掉<T> 就会由于没有先声明而报错,去掉T 就会由于函数没有返回类型报错

------解决方案--------------------

1. public <T> void func(T t) {}
这里表明func()方法要接收一个任意类型的参数,<T>放在方法前表示声明,要不然编译器就不知道func(T t)
中的T表示什么。
2.
public <T> T naiveCast(T t, Object o) {
  return (T) o; 
}
<T>这个表示的意义和上面解释的一样。 方法上的T native() 这个是表示返回值类型为 T ,而至于 return (T)应该就是表示强转了。

3.
public T naiveCast(T t, Object o) {
  return (T)o;
}
这里的 public T 这个T 表示返回值类型为 T ;  native(T t, Object o)中的T 表示要接收的参数类型为T.
注意:这里的泛型T 是和这个方法所在类所接收泛型是相同的T.
如:class  Demo <T>
{