Java 从接口实现方法,但参数不同

Java 从接口实现方法,但参数不同,java,oop,polymorphism,Java,Oop,Polymorphism,我正在寻找一种很好的方法来实现同一方法,该方法在接口中定义,但参数类型不同。这可能吗 为了澄清这一点,假设我有一个接口数据库和两个实现类Database1和Database2。数据库有一个方法createNode(…)和另一个方法modifyNode(…)。问题在于,对于Database1,createNode方法的返回类型应该是long(标识符)。然而,对于Database2,它将是一种特定于对象的技术(在本例中为OrientDB,但这并不重要,它只是扩展对象的东西)。而且两个create(…

我正在寻找一种很好的方法来实现同一方法,该方法在接口中定义,但参数类型不同。这可能吗

为了澄清这一点,假设我有一个接口数据库和两个实现类Database1和Database2。数据库有一个方法createNode(…)和另一个方法modifyNode(…)。问题在于,对于Database1,createNode方法的返回类型应该是long(标识符)。然而,对于Database2,它将是一种特定于对象的技术(在本例中为OrientDB,但这并不重要,它只是扩展对象的东西)。而且两个create(…)返回类型都应该用作modifyNode(…)参数之一

我想做的是:

`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
类中编写泛型方法。