- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
java中有没有办法指定泛型类的类型参数必须是接口(interface)(不仅仅是扩展它!)
我想做的是:
public class MyClass<X extends SomeInterface, Y extends SomeOtherClass & X>
意味着 Y 必须是 SomeOtherClass 的子类并实现 X。我目前通过编译器得到的是
The type X is not an interface; it cannot be specified as a bounded parameter
那么,我如何告诉编译器 X 必须始终是一个接口(interface)?
编辑:
好的,我想我有点过于简化了我的问题。让我们使用我的实际应用程序域来更清楚地说明:
我有一个用于表示图表的 API。 Diagram 包含 Node 和 Edge 对象。所有这三个类都实现了 Shape 接口(interface)。形状可能有子形状、父形状并属于图表。
问题是,我需要制作这个 API 的两个版本:一个仅具有基本功能的开源版本,另一个具有更多功能的扩展版本。但是,扩展 API 必须只提供方法,返回扩展类型(ExtendedDiagram、ExtendedNode、ExtendedEdge 和(问题来了)<强>扩展形状)。
所以我有这样的事情:
/* BASIC CLASSES */
public interface Shape<X extends Shape<X,Y>, Y extends Diagram<X,Y>>{
public List<X> getChildShapes();
public X getParent();
public Y getDiagram();
...
}
public class Diagram<X extends Shape<X,Y>, Y extends Diagram<X,Y>> implements Shape<X,Y>{...}
public class Edge<X extends Shape<X,Y>, Y extends Diagram<X,Y>> implements Shape<X,Y>{...}
...
/* EXTENDED CLASSES */
public interface ExtendedShape extends Shape<ExtendedShape,ExtendedDiagram> { ... }
public class ExtendedDiagram extends Diagram<ExtendedShape,ExtenedDiagram> implements ExtendedShape { ... }
public class ExtendedEdge extends Edge<ExtendedShape,ExtenedDiagram> implements ExtendedShape { ... }
...
扩展 API 工作正常,基本 API 代码给出一些警告,但主要问题出现在使用基本 API 时:
public class SomeImporter<X extends Shape<X,Y>, Y extends Diagram<X,Y>, E extends Edge<X,Y>>{
private Y diagram;
public void addNewEdge(E newEdge){
diagram.addChildShape(newEdge);
...
最后一行给了我以下警告:
The method addChildShape(X) in the type Diagram is not applicable for the arguments (E)
所以现在,我只想指定 E 也需要实现 X,一切都会好起来的 - 我希望 ;)
所有这些有意义吗?你们知道这样做的方法吗?或者有没有更好的方法来获得具有上述限制的扩展 API?
感谢您的支持,非常感谢您的帮助!
最佳答案
你可以使用:
class Foo<T extends Number & Comparable> {...}
具有一个类型参数 T 的类 Foo。Foo 必须使用 Number 的子类型并实现 Comparable 的类型进行实例化。
关于java - 如何强制泛型类型参数成为接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6061745/
我是一名优秀的程序员,十分优秀!