【问题标题】:Java interface- static method callJava接口-静态方法调用
【发布时间】:2017-01-11 14:22:50
【问题描述】:

我遇到了一个无法解决的问题,希望有人可以帮助我。本质上,我有一个散列消息和一个签名。为了验证它,我必须使用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 程序员。非常感谢你。

【问题讨论】:

  • 就像...没有任何代码存在...你认为我们是什么,通灵者???如果方法是非静态的,那么您需要通过类的实例调用它。就你的问题可以回答的这么多!
  • 欢迎来到stackoverflow!你的问题目前还很不清楚。你应该在这里阅读如何提出一个好问题:stackoverflow.com/help/how-to-ask
  • 请发布示例代码,以便我们为您提供帮助。
  • 那么你的界面是什么? Signing.verify(hash, signature) 在您的问题中的作用是什么? (对不起,这是我在你的问题中找到的唯一代码,所以我非常关注它!)Signing 是你所说的接口吗?您希望Signing 的所有子类都实现verify()?还是要将验证方法放在另一个类中?
  • 我想将它放在另一个验证多个签名的类中-我在上面添加了一些代码,希望对您有所帮助。对不起!

标签: java interface static-methods


【解决方案1】:

问题仍未 100% 明确,但据我了解,您应该找到另一个实现该接口的类。

另一种选择,远射,可能行不通:

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

不过,该代码会假定 Signature 不是接口。

【讨论】:

  • 我没有足够的声望来投票,抱歉(我试过了——如果我有足够的声望,我会回来的!)
【解决方案2】:

您可能想了解 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 的实例上调用它,而不是在类本身上。

所以以下两种解决方案都应该有效,因为它们都实例化了一个签名对象:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-16
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    相关资源
    最近更新 更多