Java - 用具体类型覆盖对象类型参数

标签 java

编辑: 我将把它留在这里作为示例。阅读评论以获取更多信息,但一般来说:不要使用此设计!这很糟糕!

我搜索了一段时间的答案,但找不到任何真正具体的说法,不,你不能,因为......或者是的,你可以,这就是你的做法......

所以问题是,我能否创建一个定义对象类型参数的抽象方法,然后使用具体的参数类型来实现它,如下所示:

public abstract class ToBeOverriden {
    public Object method1 (Object parameter);
    public String method2 (Object parameter);
    public void method3 (Object parameter);
}

然后用这个覆盖它:

public class Implementation {
    @Override
    public DateTime method1 (Person parameter){
        return new DateTime();
    }

    @Override
    public String method2 (MotorCycle parameter){
        return new DateTime();
    }

    @Override
    public void method3 (String parameter){
        return new DateTime();
    }
}

其中 Person 是我创建的对象。返回类型可以是任何类型。目前我不能这样做。它不允许我。我的猜测是这是因为我的类没有扩展对象。虽然一切都扩展了 Object...所以...

或者我需要更新我的 Java 知识吗? :)

编辑:添加了一个更复杂的类结构。

谢谢!

最佳答案

您需要使用 Java Generics :

public abstract class ToBeOverriden<E,V> {
    public E method (V parameter);
}

public class Implementation extends ToBeOverriden<DateTime,Person> {
    @Override
    public DateTime method (Person parameter){
        return new DateTime();
    }
}

添加:

E 参数可以省略,代码仍然可以编译。但是,如果 ToBeOverriden 的不同实现将使用不同的返回类型,我认为最好保留 E。但这是个人品味的问题 - 我不喜欢在代码中的任何地方看到 Object

新增 2 个:

关于您在问题中的更新,您需要为每个方法都有一个单独的通用类型。例如:

public abstract class ToBeOverriden<A,B,C> {
    public Object method1 (A parameter);
    public String method2 (B parameter);
    public void method3 (C parameter);
}

但是,通常情况下,当您需要这样一个可怕的结构时,您的代码就会以错误的方式设计。在 95% 的情况下,1 个泛型类型参数就足够了。在 4.99% 的情况下,2 个泛型类型参数就足够了。

关于Java - 用具体类型覆盖对象类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9632205/

相关文章:

java - SAML2 登录需要使用 cookie 吗?

java - 与 JAVA_HOME 不同的 Tomcat JVM 版本

java - 如何调用抽象类的私有(private)构造函数进行模拟。

java - Apache Spark Sql——分组依据

java - 使用具有给定模数和指数的 RSA 算法在 Android 中加密

java - AES/CBC/PKCS5填充问题

java - ChainReducer.setReducer 方法抛出错误 "ChainReducer is not applicable for the arguments"

java - 如何在Java中查找与通配符字符串匹配的文件?

java - 按最大行拆分非常大的文本文件

java - lombok @Data 和 @Getter 不提供 getter 函数