2017-07-27 3 views
1

Ich arbeite an meinem Projekt, wo ich überprüfen muss, ob ein bestimmter Wert einem Wert in einem Dataset entspricht oder nicht.Cast-Objekt zu unbekanntem Datentyp

Dies ist die Funktion Ich erstelle:

public void setSingleLimit(String columnName, Object limit){ 

} 

wo columnName die Säule meines Datensatzes ist, werde ich die Funktion und limit ist der Wert in der Gleichheit Bedingungsprüfung verwendet werden, Anwendung.

Also im Grunde wird diese Funktion den Wert limit nehmen und prüfen, ob alle Werte in columnName gleich oder nicht diesen Wert sind.

Allerdings weiß ich vorher nicht den Typ der Spalte. Ich kann jedoch den Datentyp der Spalte in der Funktion abrufen.

dataset.first().get(columnName).getClass() gibt mir die Klasse der Werte in einer Spalte (wir sicher und zuverlässig alle Werte in einer Spalte zu der gleichen Klasse/Datentyp annehmen kann, gehören soll)

Ich möchte die limit werfen Objekt in der Funktion zu den Spalten Klassenart erhalten, um einen Vergleich durchführen zu können.

Ich weiß, ich kann die Funktion überschreiben, so dass es verschiedene Werte (int, long, Boolean, String, etc.) akzeptieren kann und das wird sicherlich funktionieren. Ich möchte jedoch eine einzige Methode für weniger Komplexität und für ein einfaches Verständnis für meinen Endbenutzer erstellen. Wir können auch sicher davon ausgehen, dass der Benutzer einen korrekten Wert für die Funktion eingeben wird, das heißt, wenn die Spalte eine Spalte von Strings ist, wird der Benutzer keinen Wert eingeben, der kein String ist.

Irgendeine Idee von, wie ich ein Objekt zu einer Klasse werfen kann, die vorher nicht bekannt ist?

Vielen Dank.

+0

Ich denke, Sie müssen Java-Reflektion verwenden, wie [dies] (https://stackoverflow.com/questions/14319760/java-reflection-casting-to-an-unknown-object?rq=1), aber ich kann dir nicht weiter helfen weiter –

+4

Du sagst du willst auf Gleichheit prüfen. Warum kannst du nicht einfach 'equals (Object o)' benutzen? Es wird auf "Object" deklariert und akzeptiert ein "Object" als Parameter. Die Implementierung wird zur Laufzeit dynamisch gebunden. –

+0

Kennen Sie eine Untergruppe möglicher Typen, die hineingehen können? Wenn ja, dann können Sie private Methoden mit solchen Parametern erstellen und in der öffentlichen Methode verwenden Sie einfach "if (limit instanceof )" oder "if ( .getClass(). IsAssignableFrom (limit.getClass()))". Ich weiß, es ist so hässlich, aber du kannst damit leben, wenn es nicht zu viele Arten von Grenzen gibt. – bilak

Antwort

2

Sie sagen, Sie auf Gleichheit überprüfen möchten. Verwenden Sie einfach equals(Object o). Es ist unter Object deklariert und akzeptiert einen Object als Parameter. Die Implementierung wird zur Laufzeit dynamisch gebunden.

public void setSingleLimit(String columnName, Object limit){ 
    Object columnValue = getValue(columnName); 
    limit.equals(columnValue); // If limit can be null, swap variables 
} 

Beispiel: Wenn limit ein String ist, equals() von String verwendet. Es spielt keine Rolle, ob columnValue kein String ist, weil es in diesem Fall nur false zurückgibt.

Stellen Sie einfach sicher, dass die verschiedenen equals() Implementierungen tun, was Sie wollen. Wenn Sie benutzerdefinierte Klassen verwenden, können Sie sie selbst überschreiben.

1

Ohne Guss zu verwenden, würde ich so tun:

if(limit instanceof anyDataset) { 
//Compare 
} 
Verwandte Themen