Java接口 - 静态方法调用

时间:2017-01-11 14:22:51

标签: java interface static-methods

我遇到了一个问题,我无法绕过头,希望有人可以帮助我。基本上,我有一个哈希消息和签名。要验证它,我必须使用Signing.verify(hash, signature)在另一个类中调用方法。该接口也用于其他签名,因此无法更改,禁止静态方法,但Java告诉我该方法变为静态或无法验证它。 我对Java很新,但我希望有人可以帮助我。如果已经遇到问题,我很抱歉,但我没有找到任何东西。 您诚挚的,谢谢您的时间。

编辑: 对不起 - 这有点复杂。该方法在同一个包中看起来像这样 - 并且稍后要编程:

public class Signature implements SIG{
    public boolean verify(String message, String signature){
        //deadcode
        return true;
    }
}

我的代码如下所示:

public class SignatureTree implements Tree{
    public boolean verify(String message, String signature, String hash){
            byte[] publicKey=extractPK(signature);
            if(Signature.verify(message,signature)==false){
                   System.err.println("SIGNATURE VERIFICATION FAILED");
            }
            //some other stuff
    }
}

但是,Eclipse告诉我将Signature中的verify方法更改为静态方法 - 接口禁止该方法。那更清楚了吗?对不起 - 我是一名C程序员。非常感谢你。

2 个答案:

答案 0 :(得分:0)

问题仍然不是100%清楚,但从我能理解的,您应该找到另一个实现该接口的类。

远射的另一种选择可能不起作用:

if(new Signature().verify(message,signature) == false) { // fail code here }

但是,该代码会假设Signature不是接口。

答案 1 :(得分:0)

您可能希望了解Java中的类及其成员:https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

请参阅,类类似于“对象模板”,您可以实例化某个类的对象。例如,让我们创建一个简单的类:

class MyClass {
    public int var;

    public MyClass(int var) {
        this.var = var;
    }

    public void incrementVar() {
        var = var + 1;
    }

    public static boolean isSmallerThanTen(int toTest) {
        return (toTest < 10);
    }
}

现在您可以创建作为MyClass实例的对象:

MyClass firstObject = MyClass(3);
MyClass secondObject = MyClass(10);

您可以在单个对象上调用incrementVar()方法:

firstObject.incrementVar();

现在,firstObject.var为4,但未触及第二个对象,secondObject.var仍为10。

但是,你有这个方法isSmallerThanTen()独立于某个实例的属性,你可以调用MyClass.isSmallerThanTen(5)。但是,您无法调用MyClass.incrementVar(),因为incrementVar()不是静态的,只能在MyClass的实例上调用,而不能在类本身上调用。

这就是你遇到的问题,Signature.verify()不是静态的,这意味着你必须在Signature的实例上调用它,而不是在类本身上调用它。

因此,以下两个解决方案都应该起作用,因为它们都实例化了Signature的对象:

if(new Signature().verify(message,signature) == false){
    ...

Signature sig = new Signature();
if(sig.verify(message, signature) == false) {
    ...

顺便说一句:您也可以将其写为if(!sig.verify(message, signature))!是逻辑“不”,反转布尔值。