首页 > 解决方案 > Java 通用类< ? 扩展接口>作为参数

问题描述

public interface A {}
public interface B {}
public class Test implements A{}
public class Test2 {}

我做了一个方法来检查一个类是否实现了一个接口。我希望我的方法只接受通用接口而不是所有类对象。

方法

    public static boolean containsInterface(Class clazz, Class intf)
    {
    try
    {
        Validate.isTrue(intf.isInterface());
        if(clazz.isInterface())
            return JavaUtil.isClassExtending(intf, clazz);
        for(Class c : ClassUtils.getAllInterfaces(clazz))
        {
            if(JavaUtil.isClassExtending(intf, c))
                return true;
        }
    }
    catch(Throwable t)
    {
        t.printStackTrace();
    }
    return false;
}

由于 Test.class 和 Test2.class 不是 2d 参数上的接口,我希望它出现编译错误,因为 2d 参数必须是接口类

containsInterface(Test.class, Test.class);
containsInterface(Test.class, Test2.class);

可接受的使用我的方法

containsInterface(Test2.class, A.class);
containsInterface(Test.class, B.class);

我试过的

public static boolean containsInterface(Class clazz, Class<? extends Interface> intf)

我目前检查参数中的类是否是接口然后抛出异常。如果它不是接口,我宁愿强迫人们不能调用该方法开始

我知道 Annotations 和 Enum 对象可用作类签名,以确保人们正确使用参数,但我似乎找不到接口本身的参数。

有人告诉我泛型不支持接口或抽象类类型即使在 jre 9-13+ 中也是如此

标签: javaclassparametersinterfacereflect

解决方案


您不能使用类型控制系统将参数强制为任何接口实现。如果您只想Class<?>使用abstract修饰符强制,则同样适用。我不确定这是否真的需要,因为做简单类型isInterface断言是

  1. 直截了当
  2. 干净的
  3. 强大的
  4. 容易理解
  5. 容易出错
  6. 可测试

JDK 工程师也不关心这一点。将使用这种机制的一个完美示例(但没有)是 JDK 动态代理创建。您只能创建一个接口(或一组)的代理,但不能创建类。

我认为编写自己的前处理器并不值得。此外,它不是通用的-因为您假设必须在编译时知道运行时类型-动态加载的类等呢?


推荐阅读