Via Interfaces unterschiedliche Klassen ansprechen

lui

Mitglied
Hallo ,
Ich bin neu in Java, habe vorher jahre c# programmiert und weiß nicht wie ich
folgendes in Java umsetze...

versuche die Klassen java.io.File und jcifs.smb Abstrakt zu verwenden.
Ich habe eine Klasse <FileDatabrowser> ,welche diverse Suchen, Filter und Konvertierungen
für alle gelesenen(oder geschriebenen) Files macht.

Nun ist es für meine Klasse egal ob die daten über SMB(jcifs) oder IO.FILE kommen
und ich versuche nun mittels Interfaces (in C# hatte ich delegaten verwendet)
die zwei Klassen abstrakt anzusprechen (polymorphismus).
Dazu übergebe ich in der methode <getdir> den Interface Datentyp<i_File> und versuche
alle sachen über die Interface instanz zu machen.

DAS Problem is an dieser Stelle
(i_File file : f.listFiles())
ich kann nicht über die elemente des Interfaces loopen

gibt es da irgendeine Lösung ?

in c# hätte ich f.listfiles und alle weiteren funktionen per delegate umgeändert

Java:
 public interface i_File {
     String getName();
     String getPath();
     ...and many others
}

--FILE.IO Wrapper
Java:
public class genFile extends java.io.File implements i_File
{
    ...constructors
    @Override
    public String getName(){
        return super.getName();
    }

    @Override
    public String getPath(){
        return super.getPath();
    }

}

--SMB.JCIFS Wrapper
Java:
public class genSmb extends SmbFile implements i_File
{
    ...constructors
    @Override
    public String getName(){
        return super.getName();
    }

    @Override
    public String getPath(){
        return super.getPath();
    }
}

-- HAUPTKLASSE verwendet entweder SMB oder FILE IO
Java:
public class FileDatabrowser
{
    public void getdir(i_File f)
    {
        FileData fileData;
        if (f != null)
        {
            for (i_File file : f.listFiles())
            {
                if (file.canRead())
                {
                    fileData = new FileData();
                    FileDataSet(fileData,file);
                    fileDataList.add(fileData);
                }
            }
        }
    }
}
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
versuche die Klassen java.io.File und jcifs.smb Abstrakt zu verwenden.
Was soll "jcifs.smb" sein? Was meinst du mit "abstrakt verwenden"?

Dazu übergebe ich in der methode <getdir> den Interface Datentyp<i_File> und versuche
alle sachen über die Interface instanz zu machen.
Man kann keine Instanz eines Interfaces haben.
(Nebenbei: "i_" für ein Interface ist in Java sehr ungewöhnlich. Normalerweise verwendet man hier keine Pre bzw. Postfixe)

DAS Problem is an dieser Stelle
(i_File file : f.listFiles())
ich kann nicht über die elemente des Interfaces loopen
"Ich kann nicht" ist keine Fehlerbeschreibung ;)
Was kann du nicht? Kompiliert dein Code? Kommt eine Fehlermeldung?


Es ist zwar schön das du uns zeigst wie du getName bzw. getPath überschreibst, aber nicht was du bei listFiles machst, das wäre das Interessantere.
Sofern listFiles() eine entsprechende Liste zurück gibt, sollte es möglich sein mittels foreach Schleife darüber zu iterieren.
 

lui

Mitglied
1.jcifs ist ein framework (nicht von mir) für smb Datei zugriff über lan
2. i_ nur vorläufig so benannt


Also mein grundlegendes problem ist
Ich habe zwei Klassen die vollkommen identische Methoden haben, die ich aber nicht ändern kann
nun will ich in meiner Klasse nicht alle Methoden 2 mal schreiben nur weil die Klassen anderst heißen

Mein Ziel ist:
Code:
   public void getDir(AnyClassInstance o)
    {
                for (Object i : o.listFiles())
                {
                    if (i.canRead())
                    {
                        fileData = new FileData();
                        FileDataSet(fileData,i);
                        fileDataList.add(fileData);
                    }
                }
    }


Man kann keine Instanz eines Interfaces haben.
Ok das weiß ich. hab mich falsch ausgedrückt.




Listfiles ist mein problem
Die fehlermeldung ist
Error:(52, 48) java: incompatible types: java.lang.Object cannot be converted to com.company.i_file_


Die listfiles methode sieht derzeit so aus
Code:
public  interface  i_file_<T>
{
    String getName();
    String getPath();
    boolean isDirectory();
    long lastModified();
    long length();
    boolean isHidden();
    boolean canRead();
    T[] listFiles();

}

java.io.File implements i_file_
Code:
public class genFile extends java.io.File implements i_file_
{
 @Override
  public File[] listFiles()
  {
  return super.listFiles();
  }

 }

Code:
public class genSmb SmbFile implements i_file_
{
 @Override
  public SmbFile[] listFiles()
  {
  try
  {
  return super.listFiles();
  }catch (Exception e)
  {
  return null;
  }

  }

 }
 

Baldur

Aktives Mitglied
Mit C# hab ich auch noch nicht so viel gemacht, aber wenn ich das richtig verstehe erwartest du so etwas wie Duck-Typing? Du willst eine bestimmte Methode (listFiles) unabhängig davon ausführen, aus welcher Klasse die stammt?

Eventuell kommst du mit den Lambdas/Methodenreferenzen aus Java8 weiter.
Java:
public interface ListFilesWrapper {
     String[] listFiles();
}


String getFiles(ListFilesWrapper wrapper) {
    return wrapper.listFiles();
}

getFiles(my_smb_object::listFiles);

Wenn du in Java8 ein interface mit nur einer Funktion hast, kannst du dem einfach eine Methodenreferenz oder ein Lambda zuweisen. my_smb_object::listFiles weist ihm (durch den :: Operator) die Referenz auf die Methode listFiles des Objekts my_smb_object zu. Daß die Methode aus dem interface auch listFiles heißt ist dabei nur Zufall, die kann auch beliebig anders heißen.
Im Prinzip ist das nur eine Kurzschreibweise für eine anonyme Klasse:
Java:
getFiles(new ListFilesWrapper() {
    String[] listFiles() {
        return my_smb_object.listFiles();
    }
});

Hoffe das hilft weiter.
 

InfectedBytes

Top Contributor
dein i_file interface ist generisch, du ignorierst den generischen Parameter aber, daher steht für den Compiler überall nur Object. Und ein Object kann nunmal nicht implizit in ein i_File gecastet werden
 

lui

Mitglied
Du willst eine bestimmte Methode (listFiles) unabhängig davon ausführen, aus welcher Klasse die stammt?
Genau das ist es.
nn du in Java8 ein interface mit nur einer Funktion hast, kannst du dem einfach eine Methodenreferenz oder ein Lambda zuweisen
Danke das hat mir geholfen, das ist eine möglichkeit.
Nur will ich letztendlich für Android Entwickeln und das unterstützt JAVA 8 nur bedingt.
Ich habe es jetzt mit <instanceof> gelöst.
nicht sehr schön aber geht.
Code:
// Wrapper for JCIFS.SMB, FILE.IO
public final class genFile<T>
{

    public static boolean canRead(Object o)
    {
        if (o instanceof File)
            return ((File) o).canRead();
        else
            try
            {
                return ((SmbFile) o).canRead();
            } catch (SmbException e)
            {
                return false;
            }
    }

    public static <T> T[] listFiles(T o)
    {
        File[] f;
        SmbFile[] s;
        if (o instanceof File)
        {
            f = ((File) o).listFiles();
            return (T[]) f;
        } else
        {
            try
            {
                s = ((SmbFile) o).listFiles();
                return (T[]) s;
            } catch (SmbException e)
            {
                e.printStackTrace();
            }
        }
        return null;
    }


    public static int listFilesLength(Object o)
    {
        if (o instanceof File)
            return ((File) o).listFiles().length;
        else
            try
            {
                return ((SmbFile) o).listFiles().length;
            } catch (SmbException e)
            {
                return 0;
            }
    }

    public static String getName(Object o)
    {
        if (o instanceof File)
            return ((File) o).getName();
        else
            return ((SmbFile) o).getName();
    }

    public static String getPath(Object o)
    {
        if (o instanceof File)
            return ((File) o).getPath();
        else
            return ((SmbFile) o).getPath();
    }

    public static long length(Object o)
    {
        if (o instanceof File)
            return ((File) o).length();
        else
            try
            {
                return ((SmbFile) o).length();
            } catch (SmbException e)
            {
                return 0;
            }
    }

    public static boolean isDirectory(Object o)
    {
        if (o instanceof File)
            return ((File) o).isDirectory();
        else
            try
            {
                return ((SmbFile) o).isDirectory();
            } catch (SmbException e)
            {
                return false;
            }
    }

    public static long lastModified(Object o)
    {
        if (o instanceof File)
            return ((File) o).lastModified();
        else
            try
            {
                return ((SmbFile) o).lastModified();
            } catch (SmbException e)
            {
                return 0;
            }
    }

    public static boolean isHidden(Object o)
    {
        if (o instanceof File)
            return ((File) o).isHidden();
        else
            try
            {
                return ((SmbFile) o).isHidden();
            } catch (SmbException e)
            {
                return false;
            }
    }
}


W
 

lui

Mitglied
dein i_file interface ist generisch, du ignorierst den generischen Parameter aber, daher steht für den Compiler überall nur Object. Und ein Object kann nunmal nicht implizit in ein i_File gecastet werden

Ja das war verzeiflung, denn wenn ich den generischen parameter benutze kann ich die Funtkion nicht mehr nutzen

So gehts :
Code:
  public File[] listFiles()
  {
  return super.listFiles();
  }
So nicht
Code:
    public T[] listFiles()
    {
        return (T).listFiles(); ?????
    }
 

mrBrown

Super-Moderator
Mitarbeiter
Die Lösung mit einem Wrapper fände ich wesentlich eleganter und auch besser nutzbar.
Man braucht dafür auch weder Generics noch extends, einfach nur ein Interface und für beide Typen einen Wrapper, der jeweils ein Feld des Typen enthält, listfiles() gibt dann eine Liste des Interfaces zurück.
 

Baldur

Aktives Mitglied
Nur will ich letztendlich für Android Entwickeln und das unterstützt JAVA 8 nur bedingt.
Letztendlich sparst du in meinem Beispiel durch Java8 auch nur, daß du die anonyme Klasse selbst schreiben musst. Schreibst du die Klasse so aus, wie ich das darunter geschrieben habe, geht das auch mit älteren Versionen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Interfaces von Interfaces macht das noch Sinn? Java Basics - Anfänger-Themen 21
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Wozu dient Interfaces? Java Basics - Anfänger-Themen 6
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
U Funktionale Interfaces mit mehreren abstrakten Methoden? Java Basics - Anfänger-Themen 8
M Interfaces Aufgabe Java Basics - Anfänger-Themen 2
I JSON / XML Struktur mit Vererbung / Interfaces Java Basics - Anfänger-Themen 0
I XML und Interfaces aus anderen Projekten Java Basics - Anfänger-Themen 3
8u3631984 Record - Interfaces Java Basics - Anfänger-Themen 4
M Wie kann ich in einem Konstruktor die Methode eines anderen Interfaces mit den jeweiligen Parametern aufrufen? Java Basics - Anfänger-Themen 8
H Sinn von Interfaces Java Basics - Anfänger-Themen 21
B JaxB und Interfaces? Java Basics - Anfänger-Themen 2
M Funktionale Interfaces Java Basics - Anfänger-Themen 3
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
H Frage zu interfaces Java Basics - Anfänger-Themen 1
J Zweck von Interfaces immer noch nicht klar Java Basics - Anfänger-Themen 3
M Klasse erbt von Interfaces Java Basics - Anfänger-Themen 6
T Interfaces in erbenden Klassen Java Basics - Anfänger-Themen 2
T Abstrakte Klasse und Interfaces Java Basics - Anfänger-Themen 12
H Polymorphie Interfaces und statischer Typ Java Basics - Anfänger-Themen 33
T Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 7
F Exceptions in Interfaces Java Basics - Anfänger-Themen 4
F Interface Warum Interfaces? Java Basics - Anfänger-Themen 5
R interfaces Java Basics - Anfänger-Themen 1
B Interfaces Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
D Interface Wieso Aufruf aller Methoden eines Interfaces? Java Basics - Anfänger-Themen 11
J Interfaces? Java Basics - Anfänger-Themen 32
M Erstellung Interfaces....totale Anfängerfrage Java Basics - Anfänger-Themen 16
S Erste Schritte Innere Klassen und Interfaces Java Basics - Anfänger-Themen 2
J Wofür dienen Interfaces ? Java Basics - Anfänger-Themen 1
Hijo2006 Frage zu Interfaces Java Basics - Anfänger-Themen 21
Hacer Interfaces implementieren Java Basics - Anfänger-Themen 7
H Implementierung eines Interfaces erweitern Java Basics - Anfänger-Themen 13
A Verwendung von Interfaces Java Basics - Anfänger-Themen 7
J Interfaces Java Basics - Anfänger-Themen 15
D Frage bzgl. Interfaces Java Basics - Anfänger-Themen 10
D Interface Verständnisprobleme von Interfaces Java Basics - Anfänger-Themen 5
D Interface Interfaces und abstrakte Klassen implementieren Java Basics - Anfänger-Themen 4
S Rollen verändern, Interfaces austauschen wie? Java Basics - Anfänger-Themen 10
K Interfaces/Klassen etc. Java Basics - Anfänger-Themen 6
F Implementierung von Interfaces -> Problem mit main Java Basics - Anfänger-Themen 12
S Verständnisproblem bei Interfaces Java Basics - Anfänger-Themen 6
I Interface Verständnisfrage Interfaces (Bsp.: Enumeration) Java Basics - Anfänger-Themen 2
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
O Java Interfaces für andere Programmiersprachen zur Verfuegung stellen? Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
G Instanzen eines Interfaces erzeugen Java Basics - Anfänger-Themen 7
M Compiler-Fehler Alle Methoden eines Interfaces Implementiert dennoch Fehler Java Basics - Anfänger-Themen 3
V Interface Interfaces und abstrakte Klassen Java Basics - Anfänger-Themen 3
F Best Practice UML/Planung eines Projektes (Klassen, Interfaces, ...) Java Basics - Anfänger-Themen 0
V Vererbung Vererbung, Interfaces und OOP... Java Basics - Anfänger-Themen 10
C Sinn eines Interfaces? Java Basics - Anfänger-Themen 4
A Interface Poymorphismus bei Interfaces Java Basics - Anfänger-Themen 2
Pentalon Eclipse JUNO keine Vorschläge von Methoden bzw. Interfaces der eigenen Klassen Java Basics - Anfänger-Themen 5
R Mehrere Interfaces(Comparable, ...) Java Basics - Anfänger-Themen 2
J Interfaces Abstrakte Klassen Java Basics - Anfänger-Themen 15
D Interfaces und allgemeingültige Methodenaufrufe Java Basics - Anfänger-Themen 6
H Erste Schritte 2 User Interfaces für eine Anwendung Java Basics - Anfänger-Themen 7
S OOP Wann Proxies und Interfaces? Java Basics - Anfänger-Themen 3
M Interface @Inject mit Interfaces? Java Basics - Anfänger-Themen 2
F Interface Unterschied von Attributen und Methoden bei abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
V mehrfachvererbung unter interfaces Java Basics - Anfänger-Themen 10
J Interface Wie funktioniert das mit den Interfaces. Ich verstehe es einfach nicht! :( Java Basics - Anfänger-Themen 15
T Interfaces und Implementierungen Java Basics - Anfänger-Themen 12
S Interface mehrere Interfaces Java Basics - Anfänger-Themen 2
M Vererbung Problem bei Interfaces Java Basics - Anfänger-Themen 8
H Dynamische Bindung mit Interfaces und LinkedList Java Basics - Anfänger-Themen 7
F Interfaces Java Basics - Anfänger-Themen 4
M Frage zu Interfaces Java Basics - Anfänger-Themen 3
N Generics und Interfaces Java Basics - Anfänger-Themen 5
D Abstrakte Klassen und Interfaces als Paramter in Funktionen Java Basics - Anfänger-Themen 3
P OOP Aufruf eines Interfaces Java Basics - Anfänger-Themen 4
N OOP Vererbung von Interfaces Java Basics - Anfänger-Themen 12
S Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 2
D Sinn von Interfaces - Wozu? Java Basics - Anfänger-Themen 9
P Frage zu Interfaces Bsp. Java Basics - Anfänger-Themen 9
A Deklarationen in abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 11
R Adapterklassen vs Interfaces Java Basics - Anfänger-Themen 6
P Interfaces -> eins oder mehrere für eine Anwendung? Java Basics - Anfänger-Themen 9
2 Interfaces, Polymorphie und Methoden. Java Basics - Anfänger-Themen 14
A Obstlager Interfaces Java Basics - Anfänger-Themen 7
K Theor. Frage zu Interfaces Java Basics - Anfänger-Themen 30
T Frage zu Interfaces und Abstrakten Klassen Java Basics - Anfänger-Themen 4
J Interfaces Java Basics - Anfänger-Themen 14
L Interfaces Java Basics - Anfänger-Themen 5
J spiel "Gefangenendilemma" Probleme mit Interfaces Java Basics - Anfänger-Themen 8
H Interfaces in java? Java Basics - Anfänger-Themen 2
A OOP Interfaces mit gleichem Methoden Java Basics - Anfänger-Themen 15
T Interfaces: Braucht man abstrakte Klassen eigentlich noch? Java Basics - Anfänger-Themen 3
S Implementierung gegen Interfaces / List, ArrayList, LinkedList Java Basics - Anfänger-Themen 11
D Interfaces / Schnittstellen Java Basics - Anfänger-Themen 8
I Probleme mit Interfaces Java Basics - Anfänger-Themen 4
K Interfaces "Schreibaufwand" Java Basics - Anfänger-Themen 53
I Interfaces Java Basics - Anfänger-Themen 34
bigbasti Warum genau braucht man Interfaces? Java Basics - Anfänger-Themen 10
A Programmieren gegen Interfaces Java Basics - Anfänger-Themen 4
I Frage zu Collection und List Interfaces Java Basics - Anfänger-Themen 2
7 Interfaces - Aufbau Java Basics - Anfänger-Themen 9
G Interfaces mit gleichen Methoden Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben