java - 关于 Java 泛型和子类

标签 java overloading

好吧,我从来没有大量使用过泛型,想知道我是否可以按以下方式使用它们。

假设我有这门课

public class ASuperClass {
    public abstract void doSomething(String arg1, Integer arg2);
}

因此,如果我随后扩展上面的类,我将得到以下内容,我将被迫使用 String 和 Integer 的参数列表覆盖 doSomething。

public class ASubClass extends ASuperClass{
    @Override
    public void doSomething(String arg1, Integer arg2){
        some code.....
    }
}

现在,假设在我的子类中我可以覆盖 doSomething,但我需要在我的子类中添加一个额外的 String arg。所以,我想做的是:

public class ASubClass extends ASuperClass{
    @Override
    public void doSomething(String arg1, Integer arg2, String arg3){
        some code...
    }
}

上面的代码不会编译,因为我的子类没有实现基类中定义的抽象签名。所以,为了让它编译,我当然可以这样做:

public class ASubClass extends ASuperClass{
    @Override
    public void doSomething(String arg1, Integer arg2){}

    public void doSomething(String arg1, Integer areg2, String arg3){
        here is my code......
    }
}

那么,您可能会问我到底想做什么?我感兴趣的是,有没有一种方法可以使用泛型作为 arg 来“强制”类的任何子类来实现基本抽象方法,而不管 arg 列表。这样下面的代码将编译扩展 ASuperClass:

public class ASubClass extends ASuperClass{
    @Override
    public void doSomething(String arg1, Integer areg2, String arg3){
        here is my code......
    }
}

 public class AnotherSubClass extends ASuperClass{
    @Override
    public void doSomething(String arg1, Integer areg2, String arg3, Integer arg4){
        here is my code......
    }
}

那么,您能否“通用化”基类 arg 列表,以便上述两个类能够编译?像下面这样的东西?我知道下面的语法是错误的,但你能使 arg 列表通用吗?

public class ASuperClass {
    public abstract void doSomething(<?>);
}

总的来说,我的想法是在人们扩展某些基本功能的应用程序中强制执行一致性。基本上确保 ASuperClass 的每个子类都有一个 doSomething() 成员函数,以确保跨子类的一致性(特别是方法命名),但每个子类的 arg 列表可能不同。

希望上面的内容不会太困惑。有兴趣知道这是否可能。

最佳答案

方法参数是方法“签名”的一部分,用于决定覆盖。为了使子类重写其基类中的方法、实现其抽象基类的抽象方法或实现接口(interface)方法,包括参数类型在内的整个签名必须匹配。

如果您希望参数列表采用可变数量的参数,您可以使用以下语法:

public abstract void doSomething(Object ... args);

您可以在子类中覆盖具有此签名的方法,并且可以传递任意数量的参数。这个设计决定的一些不幸后果是

  • 您的参数现在是无类型的 - 在继续计算之前,每个方法都需要验证其参数列表,包括它们的类型,并且
  • 原始类型的参数需要包装在 Object 中 - 原始类型需要装箱或自动装箱。

关于java - 关于 Java 泛型和子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21287652/

相关文章:

java - getHibernateTemplate().setCacheQueries() 应该如何正确使用?

java - 当我运行 "SELECT 0 AS COL .."时,MySQL 列类型返回 decimal 或 bigint

c++ - 为 std::vector 实现 '+' 运算符

c++ - 重载 setw( )?

java - 收集与多个 AWS 服务交互的 Java 应用程序的性能指标

java - 在二叉搜索树中搜索Word对象

使用 Spring WebFlow 进行 Javascript 表单验证

c++ - 重载 C 宏

c++ - 为所有字符串类型重载模板函数

c++ - 通过交换参数顺序的函数重载