2017-06-30 2 views
0

Ich habe ein Labor für Datenstrukturen und die Lehrer fragen mich „create‚Klasse IpAddressValueHasher implementiert Hasher‘so, wenn Sie Überschreibung Hash (IpAddress) es ein langes Objekt für den zu hashCode Aufruf des ipValue des Parameters gibt. Das Problem ist, dass ich weiß nicht, wie die Schnittstelle außer Kraft zu setzen (die einen int zurückgibt), die eine Methode, die eine lange zurückgibt.Kann eine Interface-Methode mit einem anderen Rückgabewert überschrieben werden?

Hilfe oder Zeiger würden großer dank

public class IpAddressValueHasher implements Hasher<IpAddress> { 
    @Override 
    public long hash(IpAddress ip) { //error on this line, can't return long 
     long ipValue = ip.getIpValue(); 
     return ipValue; 
    } 
} 


public class IpAddress //new class 
{ 
    private long ipValue=0; 
    private String dottedDecimal="0.0.0.0"; 

    public IpAddress(){} 

    public IpAddress(String dec) 
    { 
     setDottedDecimal(dec); 
    } 

    public boolean setDottedDecimal(String s) 
    { 
     if(s==null || s.length() == 0) 
      return false; 
     dottedDecimal = s; 
     ipValue = 0; 
     String [] tokens = s.split("[.]"); 
     for(String tok : tokens){ 
      int subVal = Integer.parseInt(tok); 
      ipValue = ipValue * 256 + subVal; 
     } // end for 
     return true; 
    } 

    public long getIpValue(){ return ipValue; } 

    public String getDottedDecimal(){ return dottedDecimal; } 

    public String toString(){ return dottedDecimal + ", " + Long.toHexString(ipValue); } 
} // end class IpAddress 

public interface Hasher<E> { 
    public int hash(E elem); 
} 
+2

'public interface Hasher {public V hash (K Elem); } ' –

+0

Ich glaube nicht, dass ich die Schnittstelle selbst ändern kann, da dieser Code vom Lehrer bereitgestellt wurde. Gibt es das überhaupt nur während der Erstellung des neuen Klassencodes? –

+1

Sie können nicht, der Punkt einer Schnittstelle ist, dass es die Schnittstelle definiert. Elloitts Vorschlag ist der einzige Weg, um dies zu erreichen –

Antwort

2

zum einen sein, Covariant Rückgabetyp funktioniert nicht mit primitiven Datentypen e. Mit dem kovarianten Rückgabetyp meinen wir, dass der Rückgabetyp in der gleichen Richtung wie der der Unterklasse variieren kann. Das bedeutet, dass der Rückgabetyp dieser Methode beim Überschreiben von Methoden ein Untertyp des Rückgabetyps der überschriebenen Methode sein kann. Zum Beispiel -

public class A { 
     public Object method() {return null;} 
    } 
    public class B extends A { 
     @Override 
     public String method() {return "";} 
    } 

In Ihrem Fall können Sie ändern Sie wie folgt:

public class IpAddressValueHasher implements Hasher<IpAddress> { 
     @Override 
     public Long hash(IpAddress ip) { // This line 
      long ipValue = ip.getIpValue(); 
      return ipValue; 
     } 
    } 
    interface Hasher<E> { 
     public Number hash(E elem); // This line 
    } 
Verwandte Themen