gpt4 book ai didi

Java 泛型类 < ?扩展接口(interface) > 作为参数

转载 作者:行者123 更新时间:2023-12-01 14:33:07 25 4
gpt4 key购买 nike

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

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

方法

    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 参数的接口(interface),我希望它有一个编译错误,因为 2d 参数必须是一个接口(interface)类

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)

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

我知道注释和枚举对象可用作类签名以确保人们正确使用参数,但我似乎无法找到接口(interface)本身的对象。

我被告知泛型不支持接口(interface)或抽象类类型,即使在 jre 9-13+ 中也是如此

最佳答案

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

  1. 直截了当
  2. 清洁
  3. 健壮
  4. 易于理解
  5. 容易出错
  6. 可测试

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

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

关于Java 泛型类 < ?扩展接口(interface) > 作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59745609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com