我最近(两次)遇到以下问题 - 是否有可能在类路径特定的通用接口实现上找到?要想象这一点,请考虑以下代码片段:
public interface Cleaner<T extends Room> {}
public class KitchenCleaner implements Cleaner<Kitchen> {}
public class BathroomCleaner implements Cleaner<Bathroom> {}
现在 - 是否可以使用以下方法?:
public static <T extends Room> findCleanerServiceForRoomType(T room) {
return ???
}
返回KitchenCleaner for Kitchen课程和BathroomCleaner for Bathroom课程?当然我希望它具有可扩展性,以便在添加新的Room和Service类型时,此方法仍然有效...所以没有开关或ifs:)
答案 0 :(得分:1)
您可以向Room定义(界面或抽象类)添加一个方法,为您提供适当的清洁工具。由于您需要在添加房间时添加清洁工,因此无需额外配置。
public interface Room {
Cleaner<? extends Room> cleanerInstance();
}
public class Bathroom implements Room {
public Cleaner<Bathroom> cleanerInstance(){
return new BathroomCleaner();
}
}
如果你想在没有房间知晓的情况下找到它,你需要某种配置或查找。
答案 1 :(得分:0)
由于泛型不存在于编译之外,因此这个问题的答案是否
答案 2 :(得分:-1)
由于Generics在运行时擦除了类型,我建议你在你的界面中放一个通用的方法来返回被清理的房间:
public Class<? extends Room> getCleanedClass(){
//override in every implementation
return Kitchen.class;
}
然后你可以在这个方法上使用谓词。