[英]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.