方法参数扩展了类实现接口
我有以下类和接口:
public class BasicObject{...} public interface CodeObject{...}
我想创build一个参数需要是BasicObjecttypes并实现CodeObject的方法。 我试过这个代码,但它并不能保证clazz是一个实现CodeObject的类。
myMethod(Class<? extends BasicObject> clazz){...}
我想做这样的事情,但是这个代码不能编译:
myMethod(Class<? extends BasicObject implements CodeObject> clazz){...}
您的模式类必须扩展BasicObject
并扩展/实现CodeObject
(实际上是一个接口)。 您可以使用方法签名的通配符定义中声明的多个类来执行此操作,如下所示:
public <T extends BasicObject & CodeObject> void myMethod(Class<T> clazz)
请注意,如果您使用以下任何一种方式,它将无法正常工作:
-
public <T extends BasicObject, CodeObject> void myMethod(Class<T> clazz)
这在技术上是有效的语法,但
CodeObject
是未使用的; 该方法将接受任何扩展BasicObject
类,无论它们是扩展/实现CodeObject
。 -
public void myMethod(Class<? extends BasicObject & CodeObject> clazz)
public void myMethod(Class<? extends BasicObject, CodeObject> clazz)
根据Java,这些只是错误的语法。
这是一个有点冗长的方法,但避免了generics的麻烦。 创build另一个扩展/实现的类:
public abstract class BasicCodeObject extends BasicObject implements CodeObject {...}
那么你的方法可以是:
public <T extends BasicCodeObject> void myMethod(Class<T> clazz) {...}
有两种方法可以解决您的问题,这取决于您是否要在扩展BasicObject
方法参数中传递类types ,并实现CodeObject
或类对象 。 有两个解决scheme。
解决scheme1:
如果你想通过这个Class
,你可以这样做,正如@bontade所解释的那样,
public <R extends BasicObject & CodeObject> void myMethod(Class<R> clazz)
如果你想传递class
对象,你可以写
public <R extends BasicObject & CodeObject> void myMethod(R clazz)
以上是处理generics的更复杂的方法。
解决scheme2:
以下是更简单的一个。 你可以定义一个抽象类来扩展你想要扩展的类并实现它:
public abstract class TargetClassType extends BasicObject implements CodeObject { }
现在如果你想通过class级本身,那么
public void myMethod(Class<TargetClassType> clazz)
或者如果你想传递类对象,写
public void myMethod(TargetClassType clazz)
上述解决scheme都适合您的问题,但第二个更简单。
如果不是所有BasicObjects都实现CodeObject,那么您可以在您的方法中使用instanceof / Class.isInstance()检查(请参阅http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class .html ):
myMethod(Class<? extends BasicObject> clazz) { if (!clazz.isInstance(CodeObject)) { (indicate that the call was incorrect) } ... }
- 在Java中将Java对象转换为JsonNode
- 为什么我们需要打破案件陈述?
- Intellij IDEA Java类不保存时自动编译
- 如何使注解,如突出显示,删除线,下划线,绘制,添加文本等在Android中的PDF查看器?
- 为什么Java在configurationJMX时打开3个端口?
- java.lang.NoClassDefFoundError:org / apache / commons / fileupload / FileItemFactory
- 如何从Java 8中的LocalDateTime获取毫秒
- Java中的“public static void”是什么意思?
- Java HashMap:如何从价值中获得钥匙?