Questions tagged «type-casting»

7
在PHP中类型转换变量,这样做的实际原因是什么?
正如我们大多数人所知道的,PHP具有弱类型。对于那些不喜欢的人,PHP.net说: PHP在变量声明中不需要(或不支持)显式类型定义。变量的类型由使用该变量的上下文确定。 喜欢它还是讨厌它,PHP会即时重新发布变量。因此,以下代码有效: $var = "10"; $value = 10 + $var; var_dump($value); // int(20) PHP还允许您显式转换变量,如下所示: $var = "10"; $value = 10 + $var; $value = (string)$value; var_dump($value); // string(2) "20" 太酷了……但是,对于我自己的一生,我无法想到这样做的实际原因。 我对支持Java的语言进行强类型输入没有问题。很好,我完全理解。另外,我知道-并充分了解- 函数参数中的类型提示的用处。 上面的引用解释了我类型转换的问题。如果PHP可以随意交换类型,即使您强制转换了类型,PHP也可以这样做。当您在操作中需要某种类型时,它可以即时执行。这使得以下内容有效: $var = "10"; $value = (int)$var; $value = $value . ' TaDa!'; var_dump($value); // string(8) "10 …

10
即使对象污染了其子类的API,也可以使用强制转换的对象吗?
我有一个基础课,Base。它有两个子类,Sub1和Sub2。每个子类都有一些其他方法。例如,Sub1has Sandwich makeASandwich(Ingredients... ingredients)和Sub2has boolean contactAliens(Frequency onFrequency)。 由于这些方法采用不同的参数并且做的事情完全不同,因此它们是完全不兼容的,我不能仅使用多态来解决此问题。 Base提供了大多数功能,并且我有大量的Base对象集合。但是,所有Base对象都是a Sub1或a Sub2,有时我需要知道它们是什么。 执行以下操作似乎是个坏主意: for (Base base : bases) { if (base instanceof Sub1) { ((Sub1) base).makeASandwich(getRandomIngredients()); // ... etc. } else { // must be Sub2 ((Sub2) base).contactAliens(getFrequency()); // ... etc. } } 因此,我想出了一个避免这种情况的策略。 Base现在有以下方法: boolean isSub1(); Sub1 asSub1(); Sub2 asSub2(); …

5
我对显式强制转换运算符的使用是否合理?
我有一个大对象: class BigObject{ public int Id {get;set;} public string FieldA {get;set;} // ... public string FieldZ {get;set;} } 还有一个专门的,类似于DTO的对象: class SmallObject{ public int Id {get;set;} public EnumType Type {get;set;} public string FieldC {get;set;} public string FieldN {get;set;} } 我个人发现了将BigObject显式转换为SmallObject的概念-知道这是一种单向丢失数据的操作-非常直观且易读: var small = (SmallObject) bigOne; passSmallObjectToSomeone(small); 它使用显式运算符实现: public static explicit operator …


4
转换应该是什么意思?
当使用CI之类的低级语言进行编码时,发现强制转换有时意味着“重新解释这些字节,就像它一直是其他类型一样”,而在其他时候则是“将值智能地转换为其他类型”。 这个词的原始含义是什么,什么时候期望进行转换以及什么时候期望进行原始重新解释?

6
如何避免垂头丧气?
我的问题是关于超类Animal的特殊情况。 我Animal可以moveForward()和eat()。 Seal延伸Animal。 Dog延伸Animal。 还有一个特殊的生物也Animal被称为Human。 Human还实现了方法speak()(不是由实现Animal)。 在接受抽象方法的实现中,Animal我想使用该speak()方法。如果不进行低调,这似乎是不可能的。杰里米·米勒(Jeremy Miller)在他的文章中写道,沮丧的气味。 在这种情况下,如何避免垂头丧气呢?

3
在代码中使用抑制警告是一种好习惯吗?
我用@SuppressWarnings("unchecked")与@SuppressWarnings("null")大多上面的方法,让没有任何警告的代码编译,但我有我的怀疑。找到了这个Stackoverflow 问题。乔恩·斯基特(Jon Skeet)为此回答了一个有趣的答案。 据他介绍, 有时Java泛型只是不允许您做您想做的事情,您需要有效地告诉编译器在执行时所做的事情实际上是合法的。 但是,如果有机会引发异常该怎么办?那抑制警告不是一个坏主意吗?我是否应该知道可能出现问题的地方? 另外,如果其他人稍后修改了我的代码并添加了一些可疑的功能却又没有删除SuppressWarnings,该怎么办?如何避免和/或有其他替代方法? 我应该使用@SuppressWarnings("unchecked")和@SuppressWarnings("null")吗? 更新#1 对于未检查的类型强制转换,根据此答案(由@gnat在下面的注释中指出),有必要抑制这些警告。 许多必不可少的Java库从未进行过更新,以消除对不安全类型转换的需求。抑制这些警告是必要的,以便其他更重要的警告将被注意到并得到纠正。 在禁止其他警告的情况下,仍在灰色区域中。 更新#2 根据Oracle文档(以下一些答案也提到): 作为样式问题,程序员应始终在最有效嵌套的最深层元素上使用此注释。如果要在特定方法中禁止显示警告,则应注释该方法而不是其类。

2
正确的设计可以避免使用dynamic_cast?
经过一些研究,我似乎找不到一个简单的例子来解决我经常遇到的问题。 假设我要创建一个小应用程序,可以在其中创建Squares,Circles和其他形状,将它们显示在屏幕上,在选择它们后修改其属性,然后计算其所有周长。 我会像这样做模型类: class AbstractShape { public : typedef enum{ SQUARE = 0, CIRCLE, } SHAPE_TYPE; AbstractShape(SHAPE_TYPE type):m_type(type){} virtual ~AbstractShape(); virtual float computePerimeter() const = 0; SHAPE_TYPE getType() const{return m_type;} protected : const SHAPE_TYPE m_type; }; class Square : public AbstractShape { public: Square():AbstractShape(SQUARE){} ~Square(); void setWidth(float w){m_width = w;} …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.