当前位置: 首页 > 知识库问答 >
问题:

Java泛型类方法重写

强志学
2023-03-14

我正在做一个体验,尝试用以下方式重写泛型类的方法:

public class MyGenFun<T extends CharSequence> extends Do<String>{
    public void doX(T s){
        System.out.println("in CHILD");
    }

    public static void main (String ...a){
        MyGenFun<String> x = new MyGenFun<>();
        x.doX("Test");  /// LINE 1
    }
}

class Do<A>{

    public void doX(A a){
        System.out.println("in Super");
    }
}

为什么我不能?编译错误是

yGenFun。java:15:错误:对doX的引用不明确,Do中的方法doX(A)和MyGenFun中的方法doX(T)都匹配x.doX(“测试”);^其中A、T是类型变量:在类Do T中声明的extends对象扩展在类MyGenFun 1 error中声明的CharSequence

如果我注释“第1行”,我可以编译代码。所以我认为我是正确的。

共有3个答案

范文昌
2023-03-14

你的方法签名说你需要一个参数来传递,public void doX(ts);

so call like : x.doX("abc");
许招
2023-03-14

有了这个类层次结构,您有两个带有签名的重载方法:

public void doX(String s){

}

public void doX(CharSequence s){

}

当您将字符串传递给doX时,编译器无法推断要调用这两个方法中的哪一个,因为String同时与StringCharSequence兼容。

所以,你应该像这样重写:

public class MyGenFun<T extends CharSequence> extends Do<T>{

    @Override
    public void doX(T s){
        System.out.println("in CHILD");
    }
}
楚昀
2023-03-14

这是因为您实际上并没有重写该方法,而只是重载了它。若要重写,所有参数类型必须匹配。因此,正确的覆盖方法是

public void doX(String s) {       
}

T是扩展CharSequence的东西,它可以是String,但不需要是String,例如它也可以是CharBuffer

您实例化以下内容:

MyGenFun<String> x = new MyGenFun<>();

因此,因为您不是重写这个方法,而是重载它,所以在当前上下文中有两个具有相同签名的方法,一个来自子类,一个来自超级类:

public void doX(String a) {
...
}
 类似资料:
  • 我正在尝试覆盖子类中从父类继承抽象方法的方法。我正在尝试更改泛型返回类型,但我有点困惑。 基本泛型类: 儿童班: 实施: 我想在其中覆盖参数化方法的子视图类: 这是Eclipse抛出错误消息的地方: 注意类和接口:事件和级别: 以及继承自 的 Model 类 我试图实现的是编写更抽象的代码,因为这些类、接口将被多个类扩展(在我的例子中是不同的视图类型)。这些是抽象类:< code>BaseAdap

  • 来自Java文档:在类C中声明的实例方法m1覆盖在类A中声明的另一个实例方法m2,如果以下所有条件都为真:。。。。。m1的签名是m2签名的子签名(§8.4.2)。 方法m1的签名是方法m2签名的子签名,前提是:m1的签名与m2签名的擦除相同(§4.6)。 是对一个 如果是这样,什么是错的? EDIT1:或者如果我切换通用类型: 这种情况下有什么问题? EDIT2:我知道如何修复它,但我想了解,在这

  • 这是如何编译的: 但这并不是: 它给我以下编译错误: Impl不是抽象的,并且不会覆盖测试中的抽象方法getValue(整数) 错误:名称冲突:Impl中的getValue(T)和测试中的getValue(Integer)具有相同的擦除,但两者都不重写另一个 擦除不能确保t被整数替换吗?那么为什么第二个例子是无效的呢?

  • 安吉丽卡·兰格(Angelica Langer)在关于仿制药的常见问题解答中说(参见Technicalities.FAQ822): 如果这些方法具有具有不同边界的类型参数,则它们不会重写,因为这些方法的签名不是重写等价的。请记住,类型参数边界是泛型方法签名的一部分。 示例(泛型子类型方法重载泛型超类型方法;不推荐): 我不明白为什么方法在类中重载。据我所知,这应该是一个编译时错误,因为在和中具有相

  • 问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符

  • 如果在Java中创建泛型类(该类具有泛型类型参数),是否可以使用泛型方法(该方法采用泛型类型参数)? 考虑下面的例子: 正如您所期望的那样,对于任何对象,的实例,我都可以调用: 但是,如果我试图使用的实例而不指定泛型类型,那么调用将返回一个