- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些第三方类(class)。其精简版(为了简洁起见)功能如下:
ClassA
和 ClassB
供外部使用。这些类中的每一个类都与其他类完全无关(这意味着它们没有共同的祖先)。handle()
函数,它接受Object
类型的对象作为输入。handle()
函数检查对象的类型是否为 ClassA
或 ClassB
。该类的伪代码及其用法如下:
// Third party code..
class ClassA implements InterfaceA { ... }
class ClassB { ... }
class WeirdCode {
void registerUserMethod(func ...) { }
void handle(Object input) { ... }
}
// My caller code..
function myHandler(T??? obj) {
// Do something with obj
}
WeirdCode weirdCode = new WeirdCode(...);
weirdCode.registerUserMethod(myHandler);
weirdCode.handle(new ClassA(...));
通常,该类应一次专门用于一种类型。因此,我可以使用 ClassA
或 ClassB
,但不能同时使用两者。但是,如果我想同时处理 ClassA
和 ClassB
对象,我必须这样做:
// My caller code..
function myHandlerA(ClassA obj) { ... }
function myHandlerB(ClassB obj) { ... }
WeirdCode weirdCodeA = new WeirdCode(...);
WeirdCode weirdCodeB = new WeirdCode(...);
weirdCodeA.register(myHandlerA);
weirdCodeB.register(myHandlerB);
weirdCodeA.handle(new ClassA(...));
weirdCodeB.handle(new ClassB(...));
我希望能够执行以下操作:
// My caller code..
function myHandlerAB(Object obj) { ... }
WeirdCode weirdCode = new WeirdCode(...);
weirdCode.handle(new ClassA(...));
weirdCode.handle(new ClassB(...));
但是,如果我这样做,WeirdCode
会抛出异常,因为其中包含以下代码:
void handle(Object obj) {
...
if (ClassA.class.isAssignableFrom(obj.getType())) {
...
myHandler(obj);
}
else if (ClassB.class.isAssignableFrom(obj.getType())) {
...
myHandler(obj);
}
else {
throw new Exception();
}
...
}
在整个图中我唯一可以控制的是myHandler()
函数的原型(prototype)。是否可以定义一个类型,使得 ClassA
和 ClassB
都可以从中分配,以及 ClassA
和 ClassB
可以转换到它吗?我认为这是不可能的。但我很乐意被证明是错误的,因为这会帮助我解决我的问题。
最佳答案
The only thing I can control in this entire picture is the prototype of the myHandler() function. Is it possible to define a type such that both ClassA and ClassB are assignable from it, as well as both ClassA and ClassB to be cast-able to it?
所以你想做的是:
MyType myType1 = new ClassA(...);
MyType myType2 = new ClassB(...);
还有...
ClassA clsA = (ClassA) myType1;
ClassB clsB = (ClassB) myType2;
准确吗?
你的致命弱点是你无法控制 ClassA 和 ClassB 的类型。据我了解,这些对象是由第三方代码定义的,您无法修改。听起来您想要做的是提供一种有限多重继承的形式,这可以通过接口(interface)继承来提供。但是,由于您无法控制这些类,因此该解决方案不可行。
尽管 instanceof
运算符经常被 mock 为良好的面向对象软件设计的祸根,但在这种必须与其他人的代码进行互操作的情况下,它是必不可少的。
FWIW,Java 并不以通常理解的方式理解“原型(prototype)”(例如 JavaScript 中的原型(prototype)继承)。您不应该试图强制 Java 理解原型(prototype)继承。
关于Java - IsAssignableFrom 悖论?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34124712/
我有一些第三方类(class)。其精简版(为了简洁起见)功能如下: 提供两个类 ClassA 和 ClassB 供外部使用。这些类中的每一个类都与其他类完全无关(这意味着它们没有共同的祖先)。 有一个
我正在尝试在用户单击时为一个 div 设置动画,以便当前“主”div 移出视野,另一个 div 移入窗口,以便用户可以看到有关该事物的更多详细信息他们点击了。 我面临的问题是,我实现的用于将用户带回主
我有 3 个名为Discipline、DisciplineMembership、DisciplineManagement 的实体: 一个学科有多个学科成员 一个学科有多个学科管理 Discipline
在 Ruby 中,我们有 'bang' 方法 capitalize! 如果没有对字符串进行任何更改,它会返回一个 nil 的奇怪行为。 这意味着我无法将此命令与其他命令链接在一起,因为如果它返回 ni
人们已经无数次证明,yield return 比 list 慢。 示例:Is 'yield return' slower than "old school" return? 然而,当我尝试使用基准测试
列表基准:大小=1000,运行=50000,总时间=19.5 秒 var list = new List(Size); for (int i = 0; i { c = 0; for (i
我需要对 Paradox 数据库执行查询。有一个表,其中包含带有西里尔文字的数据,我正在尝试在这样的查询中使用西里尔文字参数: select * from AccessZone zn where zn
我是一名优秀的程序员,十分优秀!