方法参数扩展类实现接口

2022-08-31 13:10:59

我有以下类和接口:

public class BasicObject{...}
public interface CodeObject{...}

我想创建一个方法,其中参数需要是 BasicObject 类型并实现 CodeObject。我尝试了以下代码,但它并不能保证 clazz 是实现 CodeObject 的类。

myMethod(Class<? extends BasicObject> clazz){...}

我想做这样的事情,但它没有编译:

myMethod(Class<? extends BasicObject implements CodeObject> clazz){...}

答案 1

你的模式类必须扩展和扩展/实现(这实际上是一个接口)。您可以使用方法签名的通配符定义中声明的多个类来执行此操作,如下所示:BasicObjectCodeObject

public <T extends BasicObject & CodeObject> void myMethod(Class<T> clazz)

请注意,如果您通过以下任何一种方式执行此操作,它将不起作用:

  • public <T extends BasicObject, CodeObject> void myMethod(Class<T> clazz)

    这在技术上是有效的语法,但未使用;该方法将接受任何扩展的类,无论它们是否扩展/实现。CodeObjectBasicObjectCodeObject

  • public void myMethod(Class<? extends BasicObject & CodeObject> clazz)
    public void myMethod(Class<? extends BasicObject, CodeObject> clazz)

    根据Java,这些只是错误的语法。


答案 2

这是一种有点冗长的方法,但避免了泛型的头痛。创建另一个执行扩展/实现的类:

public abstract class BasicCodeObject 
    extends BasicObject 
    implements CodeObject {...}

那么你的方法可以是:

public <T extends BasicCodeObject> void myMethod(Class<T> clazz) {...}

推荐