public class MyGenericClass< G> {
public <G> G genericMethod1(G g){
System.out.println(g.toString());
return g;
}
public <X> G genericMethod2(G g) {
System.out.println(g.toString());
return g;
}
public <X> X genericMethod3(G g) {
System.out.println(g.toString());
Integer i = new Integer(100);
return (X) i;
}
public static void main(String... cmdarg) {
MyGenericClass<Employee> gemp = new MyGenericClass<Employee>();
Employee e1 = new Employee();
e1.setName("My Name");
String resultOfMethod3 = gemp.genericMethod3(e1);
System.out.println(resultOfMethod3);
}
}
Run Code Online (Sandbox Code Playgroud)
在genericMethod1:我得到编译器警告"类型参数G隐藏类型G".
问题: G隐藏哪个G?这是什么意思?
genericMethod2不显示任何错误/警告.
问题: 我认为不应该编译.为什么在同一方法签名中允许两种不同的类型?与G和X比较的典型实时示例是什么?
在genericMethod3中:我故意返回一个Integer对象,在main方法中我试图将结果赋给String.正如所料:我得到了ClassCastException.
问题:使用泛型来避免ClassCastExceptions不是最初的目的吗?为什么编译器允许它?这是泛型设计中的一个错误吗?