问题标签 [downcast]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 试图在java中将对象向下转换为文件
我写了下一段代码:
如您所见,我有一个 FILE 的 ArrayList,然后我使用返回的 result.toArray 和 Object[] 数组,但它之前是 File,所以为什么我不能像我在第三次尝试做的那样将它向下转换回 File循环中的行?我得到下一个错误:
我有哪些选择?
java - java:“向下转换”到新对象/与切片相反
对不起,我真的不知道如何为这个问题做标题;也许我不知道我想做的事情有一个名字,但我可以用一些代码来解释它:
猜猜你有一个类,不幸的是既没有复制构造函数也没有公共静态复制方法。
进一步猜测,有一些函数返回该类的对象:
现在的问题是:我想从该类派生以添加一些功能。不幸的是,我在 java 中既没有 sizeof,也没有 cc 或静态复制方法。
所以当我做一个
然后我可以克隆我的 B 并获得一个新的,但是如何将返回的 A 从 someFn() 转换为 B。无论如何在 java 中做与切片相反的操作?如果我克隆它,它仍然是一个 A,我不能逐个字段地复制它。这在 C++ 中很简单,但是如何在 Java 中做到这一点?
java - 尝试扩展 Java 对象时如何避免向下转换
我从对外部 API 的调用中获得了几个Foo类型的对象。在本地,我想用一些附加信息来处理这些对象,所以我有一个子类FooSon来添加这些额外的字段。如何将我获得的所有这些对象转换为我的新继承类型?向下转换似乎不是一种选择,因为这些对象并不是真正的FooSon。
我想出的唯一解决方案是创建一个转换函数,它将Foo对象作为参数,然后将所有公共/受保护的值复制到一个新的FooSon对象,然后返回该对象。
缺点是:
- 丢失信息(私人价值)
- 如果Foo改变了,必须调整转换函数。
Foo 类不实现复制构造函数或克隆运算符。我有 Foo 源代码,但我想避免更改它以保持与未来版本的兼容性。不过,如果它是唯一可行的选择,我会更改 Foo 实现以获得我需要的东西。
c++ - 为什么从指向 Base 的指针到指向 Derived 的指针的 static_cast “无效”?
所以我有这个代码:
mTree->getNode(groupID) 返回一个 PCSNode*。Node 是从 PCSNode 公开派生的。
我在 static_cast 上找到的所有文档都说明了这一点:“static_cast 运算符可用于诸如将指向基类的指针转换为指向派生类的指针之类的操作。”
然而,XCode 的 (GCC) 编译器表示从 PCSNode* 到 Node* 的 static_cast 无效且不允许。
这是什么原因?当我将它切换到 C 风格的演员表时,编译器没有抱怨。
谢谢。
更新:即使问题已得到解答,我仍会发布编译器错误以确保完整性,以防其他人遇到同样的问题:
错误:语义问题:不允许从“PCSNode *”到“Node *”的静态转换
oop - 哪些语言允许更改对象的身份(不强制转换)?
在这篇文章中,勇敢的人希望(在 C++ 中)将类型对象向下转换为Base
类型Derived
。假设 Derived 类型的属性不超过,如果您嫉妒该类提供的额外方法Base
,这可能是有道理的。Derived
是否有允许这种事情的编程语言?
java - 为什么我不能在 Java 中向下转换这个对象?
我有这个方法:
签名声明方法 return Message
,这是我创建的一个对象。请注意,在某些情况下,它会返回AddressMessage
我的另一个扩展对象Message
。
我的问题 - 万一我返回新的AddressMessage(arguments)
,我以后不能把它变成一个AddressMessage
对象[写作(AddressMessage) object
]
c++ - 在使用工厂模式时,我是否应该以任何方式避免向下转型?
我正在开发一个实现专有协议的服务器项目。服务器是用 C++ 中的工厂模式实现的,我们现在面临着向下转换的问题。
我正在研究的协议是为慢速网络的自动控制而设计的,例如RS485、ZigBee、窄带PLC等。我们设计了工厂模式的主服务器。当接收到一个新的帧时,我们首先识别该帧的关联设备类型,调用工厂方法生成一个新的“解析器”实例,并将帧分派给解析器实例。
我们的专有协议是用纯二进制实现的,我们可能需要的每一个信息都记录在帧本身中,因此可以尽可能简单地定义基本接口。我们还将为我们的工厂实现自动注册方法(此处省略与 std::map 操作相关的详细代码):
这种工厂模式运行良好,并且很容易扩展新的设备类型。
然而,最近我们正在尝试与提供类似功能的现有控制系统进行交互。目标系统相当老旧,它只提供一个基于 ASCII、类似 AT 命令的串行接口。我们已经设法解决了与 PTY 的通信问题,但现在要解决的问题是解析器的实现。
目标系统的命令界面相当有限。我不能只是等待并监听传入的内容,我必须轮询状态,并且我必须轮询两次——第一次轮询标头,第二次轮询有效负载——以获得完整的命令。这对我们的实现来说是个问题,因为我必须将两个帧传递给解析器实例,这样它才能工作:
换句话说,我们需要调用派生类的方法,而该方法没有在基类中定义。我们正在使用工厂模式来生成派生类的实例。
现在我们有几个选择:
简单地将两个字符串连接成一个是行不通的。这两个字符串都包含一些设备指定的信息,它们应单独解析。如果我们采用这种方法,我们将在连接字符串之前从解析器实例中执行一些“预解析”。而且我们认为这不是一个好主意。
将 parser_factory::get_instance() 的返回向下转换为 legacy_parser。
创建另一个独立的工厂,它只包含从 legacy_parser 派生的类。
更改 instance_generator 和 parser_factory 的定义,以便它们也可以生成 (legacy_parser*),同时保持所有现有代码不受影响:
/li>使用访问者模式实现“智能指针”来处理从 legacy_parser 派生的实例:
/li>
很明显,使用 dynamic_cast<> 向下转换对我们来说是最简单的方法,但是我们都不喜欢这个想法,因为我们都觉得向下转换是“邪恶的”。然而,没有人能准确地解释为什么它是“邪恶的”。
在我们做出决定之前,我希望听到更多关于这些选项的评论。
java - Android Java 类强制转换
我想知道是否有人可以为我解释一些关于班级演员的事情。
我正在玩 Android,我有一个名为 ExApp 的应用程序子类。
我想从我的一个活动中调用 ExApp 的方法,所以我这样做:
我不明白为什么我需要双括号?为什么我不能:
?
谢谢。
objective-c - Objective-C 继承;从父类向下转换/复制到派生类
在我的程序中,我有一堂课,比如说ClassA
。我想创建一个派生类,比如说ClassB
. 我的程序具有返回实例的函数ClassA
,在某些情况下,我想使用这些返回来创建ClassB
. 进行天真的向下转换不会导致任何编译器错误,但运行时错误会蔓延。这似乎与关于转换指针与对象的问题有关——无论如何,从我读过的内容来看,这是错误的在这种情况下要做。
然后我尝试模仿 C++ 的复制构造函数,但是被复制的变量超出范围或被释放,再次导致运行时错误。
我也考虑过使用类别,但这似乎不正确,原因有两个:
- 首先,我不能添加带有类别的新班级成员,如果我不能这样做,事情会变得有点复杂。
- 据我所知,通过类别添加的方法可用于类的所有实例。虽然严格来说这不是一个问题,但它并不适合我,因为我想添加的方法的某些方面会在一般环境中中断;即它们在某种程度上特定于我需要对这些类型的对象做什么。
我还在学习Objective-C。我知道论坛中有一些类似的问题,但答案要么导致类别和死胡同,要么在没有太多帮助的情况下死胡同,所以我觉得我应该简单地重新发布。
java - HashSet 的迭代器的问题
我正在尝试查看 HashSet 是否会成为我下一个项目的解决方案,因此我正在做一些非常简单的测试来检查功能。我有一个简单的课程Klant
:
并且具有通过组合的类使用HashSet
问题出在方法中toon()
基本上即使我指定迭代器将包含 Klant 对象<Klant>
本地k
对象也没有为我提供对象中getKlantNummer()
定义的方法,Klant
它k
仍然是一个Object
实例,甚至通过强制转换:
它行不通。向下铸造是危险的,但据我所知,它并没有被禁止。
有什么建议吗?