簡體   English   中英

Java:如何從另一個類(非父類)返回未知子類的對象?

[英]Java: How to return object of not known child class from another class (not parent)?

我在Google上搜索了很多,但是似乎我不知道描述這種情況的術語,因為我在編程方面還很陌生。 我有一門抽象課。 像這樣:

public abstract A { 
...
public void randomize() {...} 
... 
}

而且我有很多子類,例如class B extends A, class C extends A 然后,我有一個單獨的類,該類應該知道子類的類型。 像這樣:

public class D {

private Class<? extends A> childClassType; 

public C(Class<? extends A> type) { ... }
....
}

問題是:此類應具有一個應返回子類的對象的方法(在此處作為參數傳遞)。 這樣我就可以為他的類型賦值並調用randomize()方法。

所以基本上,我在C類中需要這樣的東西:

public [???] neededMethod() {
libraryMethodRequiringClassAsParameter(childClassType);
....
[???] childObject = ([???]) libraryMethodReturningObject();
childObject.randomize();
return childObject;
}

我不知道[???]的語法,因為我不知道如何調用這種情況。 我只可以創建一個對象(它可以工作),但是隨后我將需要重播(從對象到A的內部,從A到它的孩子的外部),這似乎很愚蠢。

任何信息將不勝感激。

我不知道我是否正確地理解了您,但是您可能要尋找的術語是generic class 是一些文檔,將其應用於您的代碼后,您可能會遇到這樣的情況

public class D<T> {
    ...
    public T neededMethod() {...}
}

包含類型的類D對於與其一起使用的類型應該是通用的。

public class D<T extends A> {

    private Class<T> childClassType; 

    public D(Class<T> type) { ... }
        ....
    }

    public T neededMethod() {
           T childObject = (T)libraryMethodRequiringClassAsParameter(childClassType);
           childObject.randomize();
           return childObject;
    }
}

我可以得到以下代碼來工作。 希望它符合您的要求:

public class A {
    ... 
    public static void doStuff(Class<? extends B> clazz) {
        try {
            C obj = clazz.newInstance();
            obj.randomize();
        } catch (InstantiationException | IllegalAccessException e) {
        }       
    }

}

abstract class B {
    abstract void randomize();
}

class C extends B {
    ...
    public void randomize() {
        System.out.println("works");
    }
}

使用Object作為數據類型怎么樣? 在Java中, Object是所有類的超類。

public Object neededMethod() {
    libraryMethodRequiringClassAsParameter(childClassType);
    ....
    Object childObject = libraryMethodReturningObject();
    if(childObject instanceof ClassFoo) {
        ((ClassFoo)childObject).randomize();
    }
    return childObject;
}

暫無
暫無

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

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