Java 从接口实现方法,但参数不同
我正在寻找一种很好的方法来实现同一方法,该方法在接口中定义,但参数类型不同。这可能吗 为了澄清这一点,假设我有一个接口数据库和两个实现类Database1和Database2。数据库有一个方法createNode(…)和另一个方法modifyNode(…)。问题在于,对于Database1,createNode方法的返回类型应该是long(标识符)。然而,对于Database2,它将是一种特定于对象的技术(在本例中为OrientDB,但这并不重要,它只是扩展对象的东西)。而且两个create(…)返回类型都应该用作modifyNode(…)参数之一 我想做的是:Java 从接口实现方法,但参数不同,java,oop,polymorphism,Java,Oop,Polymorphism,我正在寻找一种很好的方法来实现同一方法,该方法在接口中定义,但参数类型不同。这可能吗 为了澄清这一点,假设我有一个接口数据库和两个实现类Database1和Database2。数据库有一个方法createNode(…)和另一个方法modifyNode(…)。问题在于,对于Database1,createNode方法的返回类型应该是long(标识符)。然而,对于Database2,它将是一种特定于对象的技术(在本例中为OrientDB,但这并不重要,它只是扩展对象的东西)。而且两个create(…
`public interface Database {
public Object createNode(...);
public void modifyNode(Object id, ...);
...
}`
public class Database1 {
@Override
public Object createNode(...) {
...
long result = // obtain id of created node
return Long.valueOf(result);
}
@Override
public void modifyNode(Object id, ...) {
...
// use id as ((Long)id).longValue();
}
}
public class Database2 {
@Override
public Object createNode(...) {
...
SomeObject result = // obtain id of created node
return result;
}
@Override
public void modifyNode(Object id, ...) {
...
// use id as (SomeObject)id
}
}
我想知道是否有更好的方法。特别是为了避免长->长和长->长转换。我在StackOverflow中看到了许多类似的问题,但没有一个是我想要的。事先非常感谢。我想您需要
泛型方法是引入自己类型参数的方法。
这类似于声明泛型类型,但类型参数
作用域仅限于声明它的方法。静态和
允许使用非静态泛型方法以及泛型类
构造器
泛型方法的语法包括一个类型参数
尖括号,并显示在方法的返回类型之前。对于
静态泛型方法,类型参数部分必须出现在
方法的返回类型
下面是一个泛型的例子 数据库
public interface Database<T> {
public T createNode(...);
public void modifyNode(T id, ...);
...
}
公共接口数据库{
公共T createNode(…);
公共无效修改节点(T id,…);
...
}
数据库1
class Database1 implements Database<Long> {
@Override
public Long createNode(...) {
...
long result = // obtain id of created node
return result;
}
@Override
public void modifyNode(Long id, ...) {
...
// use id
}
}
类Database1实现数据库{
@凌驾
公共长createNode(…){
...
long result=//获取已创建节点的id
返回结果;
}
@凌驾
public void modifyNode(长id,…){
...
//使用id
}
}
数据库2
public class Database2 implements Database<SomeObject> {
@Override
public SomeObject createNode(...) {
...
SomeObject result = // obtain id of created node
return result;
}
@Override
public void modifyNode(SomeObject id, ...) {
...
// use id as (SomeObject)id
}
}
公共类数据库2实现数据库{
@凌驾
公共SomeObject createNode(…){
...
SomeObject结果=//获取已创建节点的id
返回结果;
}
@凌驾
public void modifyNode(SomeObject id,…){
...
//使用id作为(SomeObject)id
}
}
顺便说一句,别担心。您使用的是JDK>=5,因为存在@Override注释。同一方法的不同实现,该方法在接口中定义,但具有不同的参数类型。没有什么真正有用的,因为派生的性能损失,我实际上担心自动装箱。然后,在本例中,我应该如何调用,如果类型是动态的,则从主类中的main方法开始,首先是createNode(…),然后是带有createNode(…)输出的modifyNode(SomeObject createNodeOutput…),如果类型是动态的,则在
Database1
的情况下,只需在其实例上调用createNode
,即可创建SomeObject
的实例。在使用Database2
的情况下,您必须自己创建SomeObject
的实例,但请避免。我指的是通过数据库调用这两种方法的方法,而不是单独使用Database1和Database2。请不要使用原始类型数据库
,使用数据库
或数据库1
来声明类数据库1
的实例。编写一个代码来处理数据库1
和数据库2
。我还建议您在Main
类中编写泛型方法。