java和泛型中的继承

java和泛型中的继承,java,generics,inheritance,Java,Generics,Inheritance,我同意,如果不扩展类B,输出是“1233”,但如果用A扩展类B,代码为什么不能编译 public class SomeClass { public static class A { public void f(int x){ System.out.print("1"); } public void f(Object x){ System.out.print("2"); }

我同意,如果不扩展类B,输出是“1233”,但如果用A扩展类B,代码为什么不能编译

public class SomeClass {

    public static class A {

        public void f(int x){
            System.out.print("1");
        }

        public void f(Object x){
            System.out.print("2");
        }
    }

    public static class B // extends A {

        public <T> void f(T x){
             System.out.print("3");
        }
    }

    public static void main( String[] args){
        A a=new A();
        B b=new B();
        a.f(3);
        a.f("hello");
        b.f(3);
        b.f("hello");
    }
}
公共类SomeClass{
公共静态A类{
公共空间f(整数x){
系统输出打印(“1”);
}
公共空间f(对象x){
系统输出打印(“2”);
}
}
公共静态类B//扩展了{
公共空间f(T x){
系统输出打印(“3”);
}
}
公共静态void main(字符串[]args){
A=新的A();
B=新的B();
a、 f(3);
a、 f(“你好”);
b、 f(3);
b、 f(“你好”);
}
}

由于类型擦除问题,无法编译上述类

基类中的方法是泛型的,与父类中的
f(Object x)
相匹配。这将在编译时发生

public void f(Object x){}
public <T> void f(T x){}

由于类型擦除问题,无法编译上述类

基类中的方法是泛型的,与父类中的
f(Object x)
相匹配。这将在编译时发生

public void f(Object x){}
public <T> void f(T x){}

只有当参数列表与被重写方法的参数列表完全相同,并且返回类型应与被重写方法的返回类型相同或是其子类型(在父类中)时,才能在派生类中重写方法

您可以重写以下方法

public <T> void f(T x) {
          System.out.print("3");
      }
public void f(tx){
系统输出打印(“3”);
}

您可以找到有关

的详细信息。只有在参数列表与被重写方法的参数列表完全相同且返回类型应与被重写方法的返回类型相同或是其子类型(在父类中)的情况下,才能在派生类中重写方法

您可以重写以下方法

public <T> void f(T x) {
          System.out.print("3");
      }
public void f(tx){
系统输出打印(“3”);
}

您可以找到有关

问题的更多信息,因为方法f(字符串)对于SomeClass中的类型B不明确,您可以这样修复它

public class SomeClass {
    public static class A {
        public void f(int x) {
            System.out.print("1");
        }

        public void f(Object x) {
            System.out.print("2");
        }
    }

    public static class B extends A {
        public void f(Object x) {
            System.out.print("3");
        }
    }

    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        a.f(3);
        a.f("hello");
        b.f(3);
        b.f("hello");
    }
}

并且会起作用,希望能有所帮助。

由于方法f(String)对于SomeClass中的类型B来说是不明确的,您可以这样修复它

public class SomeClass {
    public static class A {
        public void f(int x) {
            System.out.print("1");
        }

        public void f(Object x) {
            System.out.print("2");
        }
    }

    public static class B extends A {
        public void f(Object x) {
            System.out.print("3");
        }
    }

    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        a.f(3);
        a.f("hello");
        b.f(3);
        b.f("hello");
    }
}

方法签名导致名称冲突,下面两个方法签名存在名称冲突的问题,因为泛型方法实际上没有覆盖前一个方法。之后,双方将有相同的签名

public <T> void f(T x){...}
public void f(Object x){...}

方法签名导致名称冲突,以下两个方法签名存在名称冲突问题,因为泛型方法实际上没有覆盖前一个方法签名。之后,双方将有相同的签名

public <T> void f(T x){...}
public void f(Object x){...}

Java泛型使用类型擦除<代码>javac在解析时将发生冲突

public <T> void f(T x);
public void f(Object x);
此限制是语言语法的一部分,而不是Java运行时本身。本质上,此规则旨在避免仍然使用原始类型的遗留代码中的冲突。


请参考以上答案

Java泛型使用类型擦除<代码>javac在解析时将发生冲突

public <T> void f(T x);
public void f(Object x);
此限制是语言语法的一部分,而不是Java运行时本身。本质上,此规则旨在避免仍然使用原始类型的遗留代码中的冲突。


请参考以上答案

错误消息告诉你什么?错误消息告诉你什么?这不是真的。删除方法
f(intx)
,它仍然不会编译。这不是真的。删除方法
f(int x)
,它仍然不会编译。这样说是否正确:方法不能被泛型方法覆盖(换句话说,父方法可以是泛型的,但不是它的后代)?@tami不完全正确。与基本方法相同的签名也是有效的,对于泛型方法,其他一些签名也是有效的。“与基本方法相同的签名也是有效的”,这是否意味着在两个类(A和B)中写“public void f(T x)”是正确的?如果我把“public void f(int x)”(不仅仅是“public void f(Object x)”)放进去,这也是一个重写吗?说:泛型方法不能重写方法(换句话说,父方法可以是泛型的,但不能是它的后代)?@tami不完全正确。与基本方法相同的签名也是有效的,对于泛型方法,其他一些签名也是有效的。“与基本方法相同的签名也是有效的”,这是否意味着在两个类(A和B)中写“public void f(T x)”是正确的?如果我把“public void f(int x)”(不仅仅是“public void f(Object x)”)放进去,这也是一种覆盖吗?