2017-01-11 2 views
-2

У меня проблема, я не могу окутать голову и надеюсь, что кто-то может мне помочь. По существу, у меня есть хешированное сообщение и подпись. Чтобы проверить это, я должен вызвать метод в другом классе, с Signing.verify(hash, signature). Интерфейс, также используемый для других подписей, поэтому его нельзя изменить, запрещает статические методы, но Java говорит мне, что либо метод становится статичным, либо я не могу его проверить. Я довольно новичок в Java, но надеюсь, что кто-то может мне помочь. Если проблема уже встречается, мне жаль, но я ничего не нашел. Искренне ваш, и спасибо за ваше время.Java-интерфейс - вызов статического метода

EDIT: Извините, это довольно сложно. Способ, в том же пакете, выглядит как this- и программировать позже:

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 говорит мне изменить метод проверить в Подписи к статическому методу, который запрещен интерфейсом. Разве это более ясно? Извини, я больше программист на С. Большое спасибо.

+5

Как ... без какого-либо кода ... Как вы думаете, что мы, экстрасенсы ??? Если метод нестатический, вам нужно вызвать его через экземпляр класса. Это касается вашего вопроса, на который можно ответить! –

+0

Добро пожаловать в stackoverflow! Ваш вопрос в настоящее время довольно неясен. Вы должны прочитать, как задать хороший вопрос здесь: http://stackoverflow.com/help/how-to-ask –

+0

Пожалуйста, разместите образец кода, чтобы мы могли вам помочь. – Aradhna

ответ

0

Вопрос по-прежнему не на 100% ясен, но из того, что я могу понять, вы должны найти другой класс, который реализует этот интерфейс.

Другой вариант, длинный выстрел, вероятно, не будет работать:

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

Этот код будет считать, подпись не является интерфейсом, хотя.

+0

Извините, но ваша идея сработала! Спасибо. – junie

+0

Не забудьте выбрать как ответ и upvote;) –

+0

У меня недостаточно репутации для увеличения, извините (я пробовал, хотя, если у меня хватит, я вернусь!) – junie

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, а не самим классом.

Так следующие два решения должны как работать, так как они оба экземпляра объекта Подпись:

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

и

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

Btw: Вы также можете написать это как if(!sig.verify(message, signature)), то ! является логическое «не», инвертирует логическое значение.

+0

спасибо, это помогло довольно много (: – junie