Java 在类路径上查找泛型接口的特定实现

Java 在类路径上查找泛型接口的特定实现,java,generics,classpath,Java,Generics,Classpath,我最近(两次)碰到了以下问题——是否有可能找到泛型接口的类路径特定实现?为了可视化这一点,请考虑这些代码片段: public interface Cleaner<T extends Room> {} public class KitchenCleaner implements Cleaner<Kitchen> {} public class BathroomCleaner implements Cleaner<Bathroom> {} 公共接口清理程序{}

我最近(两次)碰到了以下问题——是否有可能找到泛型接口的类路径特定实现?为了可视化这一点,请考虑这些代码片段:

public interface Cleaner<T extends Room> {}
public class KitchenCleaner implements Cleaner<Kitchen> {}
public class BathroomCleaner implements Cleaner<Bathroom> {}
公共接口清理程序{}
公共类厨房清洁器实现清洁器{}
公共类BathroomCleaner实现了Cleaner{}
现在-有可能有以下方法吗

public static <T extends Room> findCleanerServiceForRoomType(T room) {
    return ???
}
公共静态FindCleanerService错误类型(T室){
返回???
}

厨房类的厨房清洁剂和浴室类的浴室清洁剂是否退还?当然,我希望它可以扩展,这样当添加新的房间和服务类型时,这个方法仍然有效。。。因此,没有开关或ifs:)

由于泛型不存在于编译之外,因此这个问题的答案是否定的,因为泛型在运行时会擦除类型。我建议您在界面中放置一个泛型方法,返回已清理的房间:

public Class<? extends Room> getCleanedClass(){
    //override in every implementation
    return Kitchen.class;
}

public Class您可以向房间定义(接口或抽象类)中添加一个方法,该方法为您提供合适的清理器。由于在添加房间时需要添加清洁器,因此没有其他配置

public interface Room {
  Cleaner<? extends Room> cleanerInstance();
}

public class Bathroom implements Room {
  public Cleaner<Bathroom> cleanerInstance(){
    return new BathroomCleaner();
  }
}
公共接口室{

CleanerIf如果它们是您的类,您可以向接口添加一个getType()方法,并且可以在.jar文件中包含一个SPI描述符和使用。主要问题是查找类路径上的所有类。Java没有内置的支持。但您可以通过枚举类路径上的所有类来自己完成这项工作;或者查找这样做的库。然后,对于每个类,您可以使用反射来查看它是否实现了某个特定
T
A的
Cleaner
通常情况下,所谓的重复问题不是同一个问题,会阻止有用的答案被发布。我的建议是:没有对此的自动支持,所以创建一个包含
Map
(或者类似
Map
)的CleanerRegistry。我知道泛型参数会被删除,但这根本不能回答我的问题:)下面的答案其实很好:)我不确定这是如何解决问题的。好吧,我假设你已经可以扫描整个类路径来获得每个类,你只需要克服类型删除来在类级别执行检查。但很高兴看到你找到了你的解决方案。很明显。谢谢:)我会接受这个答案,因为它解决了其中一个问题。另一个问题不能用这个解决方案解决,尽管因为Room类不是我的类,它来自library(实际上是enum)…但我可以在那里使用switch语句,因为它在工厂中。谢谢!不客气,祝你好运!此代码的一个问题是,除非通过显式创建,否则清洁器的类型与房间类型没有关联。仍然可以在房间上使用不适当的清洁器(如cleanerInstance()类型是扩展房间,而不是特定的类)您可以将房间声明为
房间
,这允许您执行
公共类浴室实现房间
Cleaner cleanerInstance();
以更明确地将它们绑定在一起。