【问题标题】:Java abstract type Class compile time checkJava抽象类型类编译时检查
【发布时间】:2012-04-18 07:13:49
【问题描述】:

是否有可能在编译时检查 classType 是否指向抽象类型? 可以进行运行时检查:

void foo(Class<? extends SubType> classType) {
    Modifier.isAbstract(classType.getModifiers()); 
}

foo(AbstractType.class);    // this should pass
foo(NotAbstractType.class); // this should fail

如果在编译时也可以这样做?

【问题讨论】:

  • 您能告诉我们您想在编译时检查类型的原因吗?我认为在运行时找到类型是大多数程序员担心的事情。 (因为可能有不同的实现有这么多特定的方法(而不是被覆盖的方法))
  • 方法需要类型信息才能在私有成员中查找此类型的对象。该抽象子类类型应该定义一组可能的实现,而不是实现本身,因此编译时检查参数是否为抽象类型将有助于防止使用错误。

标签: java class time compilation abstract


【解决方案1】:

您可以编写自己的 @MustBeAbstract 注释,然后编写一个注释处理器,强制任何具有该注释的类都是抽象的。

关于注解处理请看这个问题:What is annotation processing in Java?

【讨论】:

    【解决方案2】:

    据我所知,没有自动解决方案。

    但是,如果您事先知道传递给方法 foo 的类列表,则可以实施手动解决方案。 即

    private ArrayList<Class> abstractTypes = new ArrayList<>();
    
    void foo(Class<? extends SubType> classType) {
        boolean isAbstract = false;
        for(Class c: abstractTypes)
           if((classType.getName()).equals(c.getName()){
              isAbstract = true;
              break;
           }
    
        //Do something else...   
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      相关资源
      最近更新 更多