编辑:我将此处留下来作为示例。阅读评论以获取更多信息,但一般情况下:请勿使用此设计!这很糟糕!
我现在搜索了一段时间的答案,但找不到任何真正具体的说法,不,你不能因为...或者是的,你可以这样做...
所以问题是,我可以创建一个定义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知识? :)
编辑:添加了更复杂的类结构。
谢谢!
答案 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
。