Java 类型参数G正在隐藏类型G 公共类MyGenericClass{ 公共G一般方法1(G){ System.out.println(g.toString()); 返回g; } 公共G通用方法2(G){ System.out.println(g.toString()); 返回g; } 公共X一般方法3(G){ System.out.println(g.toString()); 整数i=新整数(100); 返回(X)i; } 公共静态void main(字符串…cmdarg){ MyGenericClass gemp=新的MyGenericClass(); 员工e1=新员工(); e1.设置名称(“我的名称”); 字符串resultOfMethod3=gemp.genericMethod3(e1); 系统输出打印项次(结果方法3); } }

Java 类型参数G正在隐藏类型G 公共类MyGenericClass{ 公共G一般方法1(G){ System.out.println(g.toString()); 返回g; } 公共G通用方法2(G){ System.out.println(g.toString()); 返回g; } 公共X一般方法3(G){ System.out.println(g.toString()); 整数i=新整数(100); 返回(X)i; } 公共静态void main(字符串…cmdarg){ MyGenericClass gemp=新的MyGenericClass(); 员工e1=新员工(); e1.设置名称(“我的名称”); 字符串resultOfMethod3=gemp.genericMethod3(e1); 系统输出打印项次(结果方法3); } },java,generics,Java,Generics,在genericMethod1中:我得到编译器警告“类型参数G正在隐藏类型G” 问题: 哪个G被这个G隐藏了?这到底是什么意思 genericMethod2不显示任何错误/警告 问题: 我认为它不应该编译。为什么在同一个方法签名中允许两种不同的类型?与G和X相比,典型的实时示例是什么 在genericMethod3中:我有意返回一个Integer对象,在main方法中,我试图将结果分配给一个字符串。正如所料:我得到了ClassCastException 问题:使用泛型的最初目的不是为了避免类异常

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

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

genericMethod2不显示任何错误/警告

问题: 我认为它不应该编译。为什么在同一个方法签名中允许两种不同的类型?与G和X相比,典型的实时示例是什么

在genericMethod3中:我有意返回一个Integer对象,在main方法中,我试图将结果分配给一个字符串。正如所料:我得到了ClassCastException

问题:使用泛型的最初目的不是为了避免类异常吗?为什么编译器允许它?这是泛型设计中的一个bug吗?

公共类MyGenericClass{
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);                            

    }


}
公共G一般方法1(G){ System.out.println(g.toString()); 返回g; }
这里有两个不同的
变量,一个在类级别,一个在方法级别。这大致相当于有一个字段和一个同名的局部变量。局部变量将“赢”在这种情况下,正如方法级别
将覆盖类级别1一样。由于这是导致错误的常见原因,IDE会警告您这一点


方法2没有重新定义
,因此它不会生成警告。

更改
常规方法1
,如下所示:

public class MyGenericClass< G> {


    public <G> G genericMethod1(G g){
        System.out.println(g.toString());
        return g;

    }

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

  • 公共类MyClass
    T
    可用于类(字段、方法、内部类…)的所有实例成员(即非静态)
  • public(static)ReturnType myMethod(..){…}
    U
    仅适用于该方法
你把它们混在一起了

使用
public G genericMethod1(G)
,此
generic正在隐藏类“one”,因为它们具有相同的名称,因此后者在方法中不再可用。如果要使用类“generic”,请不要在方法级别指定它:
public G genericMethod1(G)

使用
public G genericMethod2(G)
,您定义了一个未使用的泛型
:只使用了类“generic
G


使用
public X genericMethod3(G)
,您正在定义一个用于方法返回值的泛型
。在方法体中,您正在将
int
强制转换为
X
,但您不能确定
X
是否是
int
的超级类型。从技术上讲,这可以通过
实现,但我不确定这实际上是您想要的king for.

你在你的类和方法上声明了一个泛型
G
,为什么?顺便说一句,这就是为什么方法的泛型
G
隐藏了类的类型
G
。“与G和X相比,典型的实时示例是什么?”在方法2中,你在哪里比较了一些东西?非常感谢,Tom。所以方法中的返回类型隐藏了类类型。是吗?我想我知道了。我想我的另外两个问题仍然悬而未决。没有
不是返回类型,它是为该方法定义的泛型类型。对于方法1,你的返回恰好是
G
,但它可以ld也是
int
void
。太好了!我知道了。谢谢。谢谢Sean!与方法2中的G和X相比,什么是典型的实时示例?还有为什么方法3不是非法的?使用泛型来避免类CastException的最初目的不是吗?哇..!很好的解释!我喜欢它!你能给我一些实时示例吗有足够的方法级泛型吗?Java API中的任何东西都可以。@Mohamed方法级泛型通常可以在实用程序类中找到,例如,请参阅。谢谢!很抱歉,我不能投票给你的答案,因为我是一个新用户。我还没有获得15个声誉来获得此特权。@Mohamed编译器不知道是否允许强制转换但它仍然警告您:“未选中的从整数到X的强制转换”。
public G genericMethod1(G g){
    System.out.println(g.toString());
    return g;
}