【问题标题】:Implementing methods from an interface but with different parameters从接口实现方法但具有不同的参数
【发布时间】:2013-04-14 10:16:39
【问题描述】:

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

为了澄清这一点,假设我有一个接口 Database 和两个实现类 Database1 和 Database2。数据库有一个方法 createNode(...) 和另一个 modifyNode(...)。问题是对于 Database1,createNode 方法的返回类型应该是 long(标识符)。然而,对于 Database2,它将是一个特定于技术的对象(在这种情况下是 OrientDB,但这并不重要,它只是扩展 Object 的东西,当然)。并且两个 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
    }
}

我想知道是否有更好的方法来做到这一点。特别要避免 Long -> long 和 long -> Long 转换。我在 StackOverflow 中看到了很多类似的问题,但没有一个是我想要的。非常感谢您。

【问题讨论】:

  • 接口中定义的同一方法的不同实现,但参数类型不同

标签: java oop polymorphism


【解决方案1】:

这是一个泛型的例子

数据库

public interface Database<T> {
    public T createNode(...);
    public void modifyNode(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
    }
}

数据库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
    } 
}

顺便说一句,别担心autoboxing。您正在使用 JDK >= 5,因为有 @Override 注释。

【讨论】:

  • 这真的很有用,因为派生的性能损失,我实际上担心自动装箱。
  • 那么,在这个例子中,我应该如何调用,从 Main 类中的 main 方法,首先 createNode(...),然后,使用 createNode(...) 输出, modifyNode(SomeObject createNodeOutput, ...),如果类型是动态的?
  • 如果是Database1,您只需在其实例上调用createNode 即可创建SomeObject 的实例。对于Database2,您必须自己创建SomeObject 的实例,但请避免使用raw types
  • 我的意思是通过数据库调用这两种方法,而不是分别使用 Database1 和 Database2。并且来自外部类(例如 Main 类)。
  • 请不要使用原始类型Database,使用Database&lt;Long&gt;Database1 来声明类Database1 的实例。编写代码来处理Database1Database2。我还建议您在Main 类中编写泛型方法。 See link provided by Achintya Jha.
【解决方案2】:

我想你想要Generic Methods

泛型方法是引入自己的类型参数的方法。 这类似于声明泛型类型,但类型参数的 范围仅限于声明它的方法。静态和 允许使用非静态泛型方法,以及泛型类 构造函数。

泛型方法的语法在内部包含一个类型参数 尖括号,并出现在方法的返回类型之前。为了 静态泛型方法,类型参数部分必须出现在前面 方法的返回类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-17
    • 2017-05-10
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多