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

时间:2012-03-09 10:06:47

标签: java

编辑:我将此处留下来作为示例。阅读评论以获取更多信息,但一般情况下:请勿使用此设计!这很糟糕!

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

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

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是我创建的对象。返回类型可以是任何。目前我不能这样做。它不让我。我的猜测是因为我的Class没有扩展Object。虽然一切都扩展了对象......所以......

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

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

谢谢!

3 个答案:

答案 0 :(得分:18)

您需要使用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:

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

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个通用类型参数就足够了。

答案 1 :(得分:2)

您可以执行以下操作:

public abstract class ToBeOverriden<T> {
    public Object method (T parameter);
}

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

但是如果没有泛化,你就不能这样做,问题是参数,而不是返回类型。假设您可以在没有泛化的情况下执行此操作,那么您可以使用接口来保存对实现对象的引用,并且可以使用任何对象作为参数调用该方法,而不仅仅是Person(这违反了Java的类型安全性)。

答案 2 :(得分:0)

你这样做:) The spec说:

  

如果两个方法具有相同的名称和参数,则它们具有相同的签名   类型。

您可以轻松地将public Object method (Object parameter);public Object method (Person parameter);并排放在您的班级中,这些将是不同的方法。

是的,所有课程最终都延伸Object