在类路径上查找通用接口的具体实现

时间:2017-02-17 15:15:52

标签: java generics classpath

我最近(两次)遇到以下问题 - 是否有可能在类路径特定的通用接口实现上找到?要想象这一点,请考虑以下代码片段:

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:)

3 个答案:

答案 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;
}

然后你可以在这个方法上使用谓词。