Tag: 多态性

对象类型和引用类型之间的差异

我正在研究“Head First Java”中的多态性并得出了这个概念。 有人可以用一个例子来解释吗? 编译器检查引用类的类 – 而不是Object类型。 那么参考类型和对象类型有什么区别?

SWIG Java保留从C ++反弹的对象的类信息

好的,我有一个关键词,我故意远离标签和标题。 这是“Android”,但那是因为即使该项目是在Android中,我也不认为我的问题与它有任何关系,我不想吓唬没有Android经验的人。 所以,swig的常见问题。 我在C ++类中有一个虚方法,我通过在类中添加directorfunction使它在Java中可以重载,并且它可以工作。 问题是该方法接收的多态参数也在java端扩展,并且在Java中的虚方法调用期间,该对象带有所有多态信息被剥离。 提出确切的情况; 我正在用C ++编写游戏引擎,我想在Java中愉快地使用它。 游戏引擎有一个GameObject类,它注册CollisionListener ,当碰撞引擎检测到碰撞事件时,它会调用所有已注册的collisionListener的collidedWith(GameObject & collidee)方法,并将它们与它们碰撞的对象一起传递。 class CollisionListener { public: virtual bool collidedWith(GameObject &){}; ~CollisionListener(){} // I know this needs to be virtual but let’s forget about that now }; 我正在使用以下接口文件Bridge.i将此类与GameObject类一起公开给java %module(directors=”1″) Bridge %feature(“director”) CollisionListener; %include “CollisionListener”; %feature(“director”) GameObject; %include “GameObject.h” 现在,当我从java中的CollisionListenerinheritance并重载collidedWith ,它会被一个java端GameObject对象调用。 例如,如果我从java端inheritanceGameObject类并定义一个Bullet类,当这个项目符号与另一个带有监听器的对象collidedWith ,在collidedWith方法调用中,我收到的只是一个裸GameObject (object instanceof Bullet) […]

Java- <T的含义扩展了Comparable >?

完整的上下文是: public class RClass<T extends Comparable> 我是否正确地说标题中的语句意味着插入到方法中的参数必须是实现Comparable OR或其派生类之一的类的对象? 谢谢。

带有子类参数的Java getMethod

我正在编写一个使用reflection来动态查找和调用方法的库。 只给出一个对象,一个方法名和一个参数列表,我需要调用给定的方法,就好像方法调用是在代码中显式编写的一样。 我一直在使用以下方法,在大多数情况下都可以使用: static void callMethod(Object receiver, String methodName, Object[] params) { Class[] paramTypes = new Class[params.length]; for (int i = 0; i < param.length; i++) { paramTypes[i] = params[i].getClass(); } receiver.getClass().getMethod(methodName, paramTypes).invoke(receiver, params); } 但是,当其中一个参数是方法支持的类型之一的子类时,reflectionAPI会NoSuchMethodException 。 例如,如果接收者的类定义了testMethod(Foo) ,则以下操作失败: receiver.getClass().getMethod(“testMethod”, FooSubclass.class).invoke(receiver, new FooSubclass()); 即使这有效: receiver.testMethod(new FooSubclass()); 我该如何解决这个问题? 如果方法调用是硬编码的,则没有问题 – 编译器只使用重载算法来选择最适用的方法。 但它不适用于reflection,这是我需要的。 提前致谢!

Java:Jackson具有接口属性的多态JSON反序列化对象?

我正在使用Jackson的ObjectMapper来反序列化包含接口作为其属性之一的对象的JSON表示。 这里可以看到代码的简化版本: https://gist.github.com/sscovil/8735923 基本上,我有一个具有两个属性的类Asset : type和properties 。 JSON模型如下所示: { “type”: “document”, “properties”: { “source”: “foo”, “proxy”: “bar” } } properties属性被定义为一个名为AssetProperties的接口,我有几个实现它的类(例如DocumentAssetProperties , ImageAssetProperties )。 这个想法是图像文件具有与文档文件等不同的属性(高度,宽度)。 我已经完成了本文中的示例,阅读了有关SO及更高版本的文档和问题,并在@JsonTypeInfo注释参数中尝试了不同的配置,但未能破解这个问题。 任何帮助将不胜感激。 最近,我得到的例外是: java.lang.AssertionError: Could not deserialize JSON. … Caused by: org.codehaus.jackson.map.JsonMappingException: Could not resolve type id ‘source’ into a subtype of [simple type, class AssetProperties] 提前致谢! 解: 非常感谢@MichałZiober,我能够解决这个问题。 我还能够使用Enum作为类型ID,这需要一些谷歌搜索。 这是一个带有工作代码的更新Gist: […]

怎么用而不是

所以我查看了一些Java代码并偶然发现: List l; 基本上这个列表接受某些SomeObject – SomeObject本身或其inheritance者的所有对象。 但根据多态性,它的inheritance者也可以像SomeObject一样,所以这也可以: List l; 那么,当第二个选项明确定义并且几乎相同时,为什么有人会使用第一个选项?