[英]How to ensure an argument implements an interface
我正在一個項目中,該項目具有從抽象類Generator
繼承的類的列表。 它的工作方式就像一條責任鏈 ,其中每個類都在另一個類之后實例化,並調用generate()
方法。 唯一的特別之處在於,每個Generator
都傳遞給下一個Generator
,以便下一個能夠調用上一個Generator
某些方法,以確保它以相同的假設繼續進行其工作。
通過這種設置,我希望允許鏈上的每個類確定前一個必須實現的接口,以便它知道可用的方法。
如果該類未實現此類接口,則將僅顯示錯誤(它是命令行工具)。
我一直在研究幾種可能性,但是我真的不知道如何正確地實現這一點。 您能想到在編譯時執行此操作的方法嗎? 我需要像instanceof
一樣進行運行時檢查嗎?
如果有幫助,我在這里留下一些骨架來表示我現在擁有的東西。
public abstract class Generator {
protected Generator(Object somePrivateStuff) {/* ... */}
public abstract void generate();
}
public class SpecialGenerator extends Generator {
protected SpecialGenerator(Object o) { super(o); }
public void generate() {
// Some actual implementation
}
}
public class Main {
public static void main(String[] args) {
// Dynamically load all the classes extending Generator
// via the Reflections library, and call the method generate()
// on each one
}
}
任何想法將不勝感激。 提前致謝。
如果您動態加載類(例如,按String
名稱),則instanceof
是無用的,因為您在編譯時不知道它們。 相反,您應該使用Class#isAssignableFrom()
:
for (Class<?> clazz : loaded) {
if (Generator.class.isAssignableFrom(clazz)) {
// instantiate
} else {
// print error
}
}
在不知道應如何精確執行實例化的情況下,很難建議更詳細的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.