当前位置: 首页 > 知识库问答 >
问题:

方法参数扩展类实现接口

田昊天
2023-03-14

我有以下类和接口:

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

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

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

我想做这样的事情,但它无法编译:

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

共有3个答案

晁开宇
2023-03-14

有两种方法可以解决您的问题,这取决于您是希望在扩展BasicObject并实现CodeObject的方法参数中传递类类型,还是希望传递这样做的类对象。两者都有解决方案。

解决方案一:

如果你想通过本身,你可以这样做,正如@bontade所解释的,

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

如果你想传递class对象,你可以写

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

以上是处理泛型的更复杂的方法。

解决方案二:

下面是一个简单的例子。您可以定义一个抽象类来扩展您想要扩展的类并实现它:

public abstract class TargetClassType extends BasicObject implements CodeObject {

}

如果你想通过这门课,那就通过吧

public void myMethod(Class<TargetClassType> clazz)

或者,如果要传递类对象,请编写

public void myMethod(TargetClassType clazz)

上述任何一种解决方案都符合你的问题,但第二种更简单。

黄靖
2023-03-14

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

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

那么你的方法可以是:

public <T extends BasicCodeObject> void myMethod(Class<T> clazz) {...}
鲜于阳
2023-03-14

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

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

请注意,如果您使用以下任何一种方法,它都不会起作用:

>

  • <代码>公共

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

    public void myMethod(类

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

  •  类似资料:
    • 问题内容: 我有以下类和接口: 我想创建一个方法,其中参数需要为BasicObject类型并实现CodeObject。我尝试了以下代码,但不能保证clazz是实现CodeObject的类。 我想做这样的事情,但不能编译: 问题答案: 您的模式类必须扩展和扩展/实现(实际上是一个接口)。您可以使用方法签名的通配符定义中声明的多个类来执行此操作,如下所示: 请注意,如果您通过以下任何一种方式进行操作,

    • 我希望有一个方法返回一个类 ,该类根据作业类型具有不同的方法。 例如,作业类型可以是 或 。它们不共享方法,但需要从单个方法getJob()中获取它们。 现在我有一个普通的类< code>job,它的方法返回< code>null,没有构造函数,因为我在< code>getJob()方法中构造了其他类(例如BackupJob或RunCommandJob)。 在返回单个类的同时获得不同工作类的最佳方

    • 问题内容: 为了减少类的依赖性,我想将参数(使用泛型类)发送到扩展某些类并实现接口的构造函数,例如 可能吗? 此外,使用T类,我想使用T.getActivity()作为Context创建视图。 问题答案: T必须扩展Fragment并实现SomeInterface 在这种情况下,您可以声明以下内容: 这将需要扩展和实现类型的对象。 此外,使用T类,我想使用T.getActivity()作为Cont

    • 我一直在玩扩展方法,以便为现有接口添加一些功能。当我隐式实现接口成员时,编译器选择接口成员实现而不是扩展方法,如本MSDN页面所述。 但是,当我尝试显式实现时,似乎选择了扩展方法而不是接口的实现成员。 当我显式实现给定的扩展方法(下面是CExt)时,它不会绑定。 在这个实现之后,它返回整数值,而不是抛出异常! 然而,当我隐式实现接口成员时(见下文),我的代码会抛出异常。

    • 但是现在,我希望这些接口实现也可用于扩展,例如。 我如何设置我的课程来实现这一点?(或者,反对这样做的固有缺陷或代码气味是什么?)

    • 本文向大家介绍Android实现扩展Menu的方法,包括了Android实现扩展Menu的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android实现扩展Menu的方法。分享给大家供大家参考。具体如下: 1. java代码: 2. java代码: 3. 运行结果: 希望本文所述对大家的Android程序设计有所帮助。