2017-01-15 6 views
0

У меня есть экземпляр хранения данных String, integer, double, ... и я сохраняю данные (Oblect dataHolder) и (Class dataHolderClass). Мой вопрос заключается в том, как отливать назадdataHolder - int, String ...?Объект Java casting с использованием класса

Например у меня есть следующий класс данных:

class DataHolderClass { 
    private Object data; 
    private Class classData; 

    DataHolderClass(Object data, Class dataClass) { 
     this.data = data; 
     this.classData = dataClass; 
    } 

    Object getDataBack() { 
     return this.data; 
    } 

    Class getDataClassBack() { 
     return this.classData; 
    } 
} 

Так как я могу бросить данные обратно зная dataClass и имеющие data? А вот некоторый код вызова (не уверен, если это возможно сделать такой вид магии):

..... 
public void foo(DataHolderClass input) { 
    Class inputClass = input.getDataClassBack(); 
    Constructor constr = inputClass.getConstructor(); 
    DataType recoveredData = constr.newInstance(); 
    // ^------- the DataType is defined in inputClass but how can I get it? 
    recoveredData = (DataType) input.getDataBack(); 
    ... 
} 
+4

Используя [общий тип] (https://docs.oracle.com/javase/tutorial/java/generics/types.html). – Seelenvirtuose

+0

Не понимаю. В чем? Если на вызывающем узле уже есть переменная некоторого типа для хранения данных, то это тип, на который выполняется преобразование. Если это не так, зачем вам бросать? – EJP

+0

У меня есть второй класс с методом, который получает DataHolderClass в качестве аргумента. Извлекает данные из объекта DataHolderClass и использует его (для чего-то). Но он возвращает данные (как-то) к исходному типу данных (classData). – Banish

ответ

2

Именно здесь, так как ява 5 - дженерик.

class DataHolderClass<T> { 
    T data; 

    DataHolderClass(T data) { ... } 
    T getData() { 
     return data; 
    } 
} 

У вас есть тип безопасности из коробки.

+0

Я знаю, как использовать generics, но как я могу отбросить его обратно, если я отправлю его другому методу, который знает только, что его аргумент является объектом DataHolderClass? Он может извлекать данные, извлекать класс, но как его вернуть? – Banish

+1

Измените метод из 'foo (DataHodlerClass)' на ' foo (DataHolderClass )' –

+0

Это когда задан тип данных, содержащийся в DataHolderClass. И что, если я хочу использовать DataHolderClass в качестве универсального контейнера, который также может предоставить мне информацию о содержимом данных? И как вернуть его к исходному типу (T, String, Integer ..) без инструкции if-else? – Banish

0

Если вы можете ограничить возможности того, что может быть DataObject, вы можете использовать, если/другое последовательность с InstanceOf проверить как

Integer castInt; 
Double castDbl; 
String castStr; 
if (dataObject instanceof Integer) castInt = (Integer) dataObject; 
else if (dataObject instanceof Double) castDbl = (Double) dataObject; 
else if (dataObject instanceof Double) castStr = (String) dataObject; 

Это сделано, вы в конечном итоге с проблемой, что отбрасываемой поле для использования с по ним ,

+0

Существует ли окольный способ определения типа данных без оператора if-else и только один контейнер данных, но не 3 отдельных контейнера для Integer, Double и String? Как насчет отражения? Это решение и как? – Banish

Смежные вопросы