gpt4 book ai didi

java - 类型参数 G 隐藏了类型 G

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:08:06 27 4
gpt4 key购买 nike

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);

}


}

在 genericMethod1 中:我收到编译器警告“类型参数 G 隐藏了类型 G”。

问题:这个G隐藏了哪个G?这到底是什么意思?

genericMethod2 不显示任何错误/警告。

问题:我认为它不应该编译。为什么在同一个方法签名中允许两种不同的类型?有什么典型的实时例子可以与 G 和 X 进行比较?

在 genericMethod3 中:我有意返回一个 Integer 对象,在 main 方法中我试图将结果分配给一个 String。正如预期的那样:我得到了 ClassCastException。

问题: 使用泛型的最初目的不就是为了避免 ClassCastExceptions 吗?为什么编译器允许它?这是泛型设计中的错误吗?

最佳答案

泛型可以在类级别和方法级别使用:

  • public class MyClass<T> : T可用于类的所有实例成员(即非静态)(字段、方法、内部类...)
  • public (static) <U> ReturnType myMethod(..) {...} : U仅适用于该方法

你在混合它们。

public <G> G genericMethod1(G g) , 这个<G> generic 隐藏类的一个,因为它们具有相同的名称,因此后者在方法中不再可用。如果要使用类的泛型,请不要在方法级别指定它:public G genericMethod1(G g) .

public <X> G genericMethod2(G g) ,你正在定义一个通用的 <X>未使用:仅类的通用 G被使用。

public <X> X genericMethod3(G g) ,你正在定义一个通用的 <X>用于方法的返回值。在方法主体中,您正在转换 intX但你不能确定 Xint 的父类(super class)型.从技术上讲,这可以用 <X super Integer> 来完成,但我不确定这是否真的是您要查找的内容。

关于java - 类型参数 G 隐藏了类型 G,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32820133/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com