[英]How to check class validity with generic class
我正在研究必須將基類轉換為派生類的代碼,在派生類中,我有一組由基類派生的泛型類型。
例如,我有Base和Derived1,Derived2,並將它們放入Class [] {Derived1.class,Derived2.class}中,然后將此數組傳遞給類的構造函數。
在此構造函數中,我必須創建這些派生類的實例,但我不知道該怎么做,因為我得到了Class和Base不兼容的信息。
這是我的代碼示例
public abstract class Base {
public abstract Base create(String s);
}
public class Derived extends Base {
java.lang.Integer value;
private static Derived integer = new Derived();
public static Derived getInstance(){
return integer;
}
public Base create(String s) {
value = java.lang.Integer.parseInt(s);
return this;
}
}
public class Clazz {
Class<? extends Base> type;
ArrayList<Base> arrayList;
public Class<? extends Base> getType() {
return type;
}
}
public class AnotherClazz{
ArrayList<Clazz> clazzArrayList;
Class<? extends Base>[] types;
AnotherClazz(Class<? extends Base>[] args){
clazzArrayList = new ArrayList<>();
types = args; // assuming I pass 2 elements in array
String[] strings = new String[]{"1","2"};
for (int i=0; i<args.length; ++i){
if (types[i] instanceof Base){
// here i want to check validity of class
}
}
for (int i=0; i<strings.length; ++i){
clazzArrayList.get(i).arrayList.add(((types[i]) Base).getInstance().create(strings[i]));
//here i want to create instance of object from type assigned to specific column
}
}
謝謝您的幫助。
要檢查有效性,請嘗試此
if (types[i].getClass().isAssignableFrom(Base.class))
如果我正確閱讀了該問題,則您想創建一些派生類的實例,這些實例都具有相同的構造函數參數。 如果是這種情況,則需要為每個派生類提供相同的構造函數(它不必在基類中),然后使用Constructor.newInstance(parameters)創建實例。 此外,由於要確保每個派生類都可擴展基類,因此您將要使用Class.isAssignableFrom(class)。 例如,
import java.lang.reflect.Constructor;
public class SO52930530 {
public abstract static class Base {
public abstract <T> T getValue();
}
public static class Derived1 extends Base {
String value;
public Derived1(String value) {
this.value = value;
}
public <T> T getValue() {
return (T) value;
}
}
public static class Derived2 extends Base {
Integer value;
public Derived2(String value) {
this.value = new Integer(value);
}
public <T> T getValue() {
return (T) value;
}
}
public static void main(String... args) throws Exception {
Class<? extends Base>[] extensions = new Class[]{Derived1.class, Derived2.class};
String[] values = new String[]{"a", "1"};
Base[] instances = new Base[values.length];
for (int i = 0; i < instances.length; i++) {
Class extension = extensions[i];
if (Base.class.isAssignableFrom(extension)) {
Constructor constructor = extension.getConstructor(String.class);
instances[i] = (Base) constructor.newInstance(values[i]);
}
}
for (int i = 0; i < instances.length; i++) {
System.out.printf("%d %s %s\n", i, instances[i].getClass(), instances[i].getValue());
}
}
}
我希望這有幫助。
感謝您幫助檢查有效性(它可以工作!),但我仍然無法獲得newInstance的創建,因為我必須從.csv文件中讀取數據,而我的派生類實際上是諸如int,float等原始類型的“包裝器”我應該使用方法getInstance()和create(string s)創建新對象,所以它看起來像這樣:
public static class Derived1 extends Base { //Integer wrapper
Integer value;
public Derived1(Integer value) {
this.value = value;
}
private static Integer integer = new Integer();
public static Integer getInstance(){
return integer;
}
private Integer(){};
public Base create(String s) {
value = java.lang.Integer.parseInt(s);
return this;
}
}
而且我不知道如何使用Class強制轉換為適當的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.