2 Stimmen

Wie man in Java generische Parameter übergibt

In Java habe ich zwei Klassen:

Class A
{
  public String ID;
  public Object Name;
}

Class B
{
  public String ID;
  public Object Name;
}

Ich möchte eine Methode haben, der ich entweder ein Objekt der Klasse A oder B übergeben kann:

public void SomeMethod(???  arg)
{
  String id = arg.ID;
  Object name= arg.Name;
}

Ist es möglich, ein Objekt der Klasse A oder B an diese Methode zu übergeben? Wenn ja, wie ist die Signatur der Methode geschrieben?

Die einzige Lösung, die mir einfällt, besteht darin, eine Schnittstelle zu erstellen, die sowohl von Klasse A als auch von Klasse B implementiert wird und get- und set-Methoden zum Setzen der Felder ID und Name enthält. Dann würde die Signatur der Methode ein Parameter sein, dessen Typ die Schnittstelle ist. Ich hatte gehofft, dass es vielleicht einen einfacheren Weg gibt, möglicherweise mit Generika?

4voto

Brett Walker Punkte 3566

Es ist richtig, dass Sie eine Schnittstelle (oder eine abstrakte Klasse) mit den entsprechenden Methodensignaturen verwenden müssen. Für Java sind die beiden Klassen unterschiedlich und haben nichts (außer Object) gemeinsam. Sie müssen eine Klassenhierarchie erstellen, die die Gemeinsamkeiten zwischen ihnen widerspiegelt.

2voto

tskuzzy Punkte 35019

Verwenden Sie Methodenüberladung .

public void SomeMethod(A arg)
{
  String id = arg.ID;
  Object name= arg.Name;
}

public void SomeMethod(B arg)
{
  String id = arg.ID;
  Object name= arg.Name;
}

Sie könnten eine Schnittstelle erstellen und A y B sie umzusetzen. Das hängt wirklich von Ihrer Anwendung ab. Für kleine Programme, würde ich nur mit Methode Überladung bleiben, da es nur unnötige Abstraktion in Ihr Programm einführt.

Für größere Anwendungen, bei denen die Erweiterbarkeit eine Priorität ist, sollten Sie die Verwendung einer Schnittstelle in Betracht ziehen. Angenommen, Sie wollen später Klassen schreiben C y D die auch über SomeMethod() . Wenn Sie eine Schnittstelle verwenden, müssen Sie nicht Ihren gesamten Code durchgehen und die entsprechenden Methoden immer wieder überladen.

Wenn Sie mit Sicherheit wissen, dass A y B sind das Ende der Geschichte, dann ist es nicht nötig, eine Schnittstelle zu schaffen.

EDIT: Wenn eine Menge Code zu duplizieren ist, dann machen Sie eine Hilfsmethode:

public void SomeMethod(A arg)
{
  HelpMePlease( arg.ID, arg.Name );
}

public void SomeMethod(B arg)
{
  HelpMePlease( arg.ID, arg.Name );
}

private void HelpMePlease( String id, Object name ) {
  // 1000 lines of code here
}

1voto

Andrew Fielden Punkte 3521

Sie brauchen keine generischen Typen. Einfache Vererbung reicht völlig aus

abstract class Base {
  public String ID;
  public Object Name;
}

class A extends Base {
}

class B extends Base {
}

public void SomeMethod(Base arg)
{
  String id = arg.ID;
  Object name= arg.Name;
}

1voto

Dilum Ranatunga Punkte 13094

Generika sollen die Typsicherheit beim Kompilieren verbessern.

Das, wonach Sie fragen, scheint so etwas wie C++ zu sein Konzepte oder verschiedene andere Sprachen". Duckmäuserschreiben .

Wenn in Java eine Folge von Operationen an zwei unterschiedlichen Typen durchgeführt werden muss, müssen Sie eine Schnittstelle einführen oder auf Skripting/Reflection zurückgreifen.

0voto

PaulJWilliams Punkte 18533

Definieren Sie zwei Schnittstellen, hasID und hasName, und dann:

public class MyClass<A extends hasID & hasName>{
    public void SomeMethod(A object) {
        String id = object.getID();
        Object name= object.getName();
    }
}

Wobei getID und getName auf ihren jeweiligen Schnittstellen definiert sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X