簡體   English   中英

Java將傳遞給方法的對象轉換為其原始類型

[英]Java casting an object passed to method to its original type

我有一個名為EtcStruct類的對象的itemsData的列表,但是該類可以根據我要使用的文件而有所不同(該類充滿了變量設置器和獲取器):

ObservableList<EtcStruct> itemsData =  FXCollections.observableArrayList();

我將其傳遞給應該適用於任何對象類型的方法,我選擇並從文件中運行調用的方法。

public static void parseToFile(ObservableList itemsData){
    EtcStruct itemObject = (EtcStruct) itemsData.get(0);
    System.out.print((int)reflectedmethod.invoke(itemObject);
}

上面的代碼有效,但是我想要實現的是使方法在不編輯對象類型的情況下工作,以使其對於我計划使用的任何structclass都更加靈活。

我嘗試通過傳遞Struct類名稱和.getClass()來返回原始類型,但是我不知道該如何處理以使itemsData的新對象成為原始類型並轉換itemsData對象。

public static void parseToFile(ObservableList itemsData,Class c){
    Object itemObject = c.newInstance();
    Object newobject = curClass.newInstance();
    newobject = c.cast(itemsList.get(0));
}

以上對我來說似乎很愚蠢,顯然沒有用。

閱讀您的評論后,我會更好地理解為什么有人會在您的案例中使用反思。 GUI構建器/編輯器是一個示例,其中反射用於提供設置/獲取組件值的接口。 恕我直言,當您擁有課程並成為主要設計師時,反射並不是您要設計的工具。 如果可能的話,您應該爭取更多這樣的東西:

interface Parsable {
    default int parse() {
        System.out.println("Here I do something basic");
        return 0;
    }
}

class BasicStruct implements Parsable { }

class EtcStruct implements Parsable {

    @Override
    public int parse() {
        System.out.println("Here I do something specific to an EtcStruct");
        return 1;
    }
}

// If some structs have a parent-child relationship
// you can alternatively `extend EtcStruct` for example.
class OtherStruct extends EtcStruct {

    @Override
    public int parse() {
        super.parse();
        System.out.println("Here I do something specific to an OtherStruct");
        return 2;
    }
}

void parseToFile(Parsable parsable) {
    System.out.println(parsable.parse());
}

// If you use a generic with a specific class you don't
// have to guess or care which kind it is!
void parseToFile(ObservableList<Parsable> parsables) {
    for (Parsable p : parsables) {
        parseToFile(p);
    }
}


public static void main(String[] args) {
    ObservableList<Parsable> parsables = FXCollections.observableArrayList();
    parsables.add(new BasicStruct());
    parsables.add(new EtcStruct());
    parsables.add(new OtherStruct());
    parseToFile(parsables);
}


輸出:

Here I do something basic
0
Here I do something specific to an EtcStruct
1
Here I do something specific to an EtcStruct
Here I do something specific to an OtherStruct
2

當然,這只是一個示例,需要對其進行更改以滿足您的需求。

但是我仍然不明白的是,如果您能夠文件中解析為什么無法解析為一個文件。 盡管如此,我還是拍了一些代碼 ,向您展示了在僅處理Object時如何手動將對象解析為文件。

這個想法是要滿足像豆一樣的合同。 也就是說,每個結構都應提供一個無參數的構造函數,您要通過反射管理的所有字段都將遵循Java命名約定,並且將具有公共setter和getter。

不要陷入文件編寫中; 這將取決於您的需求。 請注意,通過遵循此約定,我可以將任何Object視為可解析的結構。 此處未精煉的版本供參考:

public void parseToFile(Object object) throws IOException, InvocationTargetException, IllegalAccessException {
    fos = new FileOutputStream("example" + object.getClass().getSimpleName());
    List<Method> getters = Arrays.stream(object.getClass().getMethods())
            .filter(method -> method.getName().startsWith("get") && !method.getName().endsWith("Class"))
            .collect(Collectors.toList());
    for (Method getter : getters) {
        String methodName = getter.getName();
        String key = String.valueOf(Character.toLowerCase(methodName.charAt(3))) +
                methodName.substring(4, methodName.length());
        fos.write((key + " : " + String.valueOf(getter.invoke(object)) + "\n").getBytes());
    }
    fos.close();
}

我認為您仍然可以使用泛型來保持靜態對象的類型。 嘗試參數化函數parseToFile。 這是一個例子:

public static void parseToFile(ObservableList<EtcStruct> itemsData){
  EtcStruct itemObject = itemsData.get(0);
  System.out.print((int)reflectedmethod.invoke(itemObject);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM