从接口实现方法但具有不同的参数

时间:2013-04-21 13:05:14

标签: java oop polymorphism

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

为了澄清这一点,假设我有一个接口数据库和两个实现类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
    }
}

我想知道是否有更好的方法来做到这一点。特别要避免长 - >长和长 - >转换时间长。我在StackOverflow中看到了许多类似的问题,但它们都不是我想要的。非常感谢你提前。

2 个答案:

答案 0 :(得分:6)

这是一个泛型的例子

<强>数据库

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
    }
}

<强>的Database2

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&gt; = 5,因为有@Override注释。

答案 1 :(得分:2)

我想你想要Generic Methods

  

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

     

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