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

Han*_*bal 7 java

编辑:我将在此留下这个例子.阅读评论以获取更多信息,但一般情况下:请勿使用此设计!这不好!

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

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

public abstract class ToBeOverriden {
    public Object method1 (Object parameter);
    public String method2 (Object parameter);
    public void method3 (Object parameter);
}
Run Code Online (Sandbox Code Playgroud)

然后用这个覆盖它:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

人是我创造的对象.返回类型可以是任何.目前我不能这样做.它不让我.我的猜测是因为我的Class没有扩展Object.虽然一切都扩展了对象...所以......

或者我是否需要刷新我的Java知识?:)

编辑:添加了更复杂的类结构.

谢谢!

bez*_*max 19

您需要使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

添加:

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

新增2:

至于您在问题中的更新,您需要为每个方法都有一个单独的Generic类型.例如:

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

但是,通常,当你需要这么糟糕的结构时 - 那么你的代码设计是错误的.在95%的情况下,1个泛型类型参数就足够了.在4.99%的情况下,2个泛型类型参数就足够了.