Questions tagged «casting»

强制转换是一个过程,其中如果允许转换,则将对象类型显式转换为另一种类型。此过程可能会导致价值变化。

8
如何让Java方法返回任何类型的通用列表?
我想写一个方法,可以返回java.util.List任何类型的a ,而无需进行类型转换: List<User> users = magicalListGetter(User.class); List<Vehicle> vehicles = magicalListGetter(Vehicle.class); List<String> strings = magicalListGetter(String.class); 方法签名是什么样的?可能是这样的: public List<<?> ?> magicalListGetter(Class<?> clazz) { List<?> list = doMagicalVooDooHere(); return list; }

11
用户定义的基类转换运算符
介绍 我知道“不允许在用户定义的基础类之间进行转换”。作为对此规则的解释,MSDN给出了“您不需要此运算符”。 我确实知道不需要用户定义的向基类的转换,因为这显然是隐式完成的。但是,我确实需要从基类进行转换。 在我当前的设计中,使用非托管代码的包装程序,我使用存储在Entity类中的指针。所有使用指针的类都从该Entity类派生,例如,Body类。 因此,我有: 方法一 class Entity { IntPtr Pointer; Entity(IntPtr pointer) { this.Pointer = pointer; } } class Body : Entity { Body(IntPtr pointer) : base(pointer) { } explicit operator Body(Entity e) { return new Body(e.Pointer); } } 此演员表是非法的。(请注意,我没有费心编写访问器)。没有它,编译器将允许我执行以下操作: 方法B (Body)myEntity ... 但是,在运行时,我会得到一个例外,说明此强制转换是不可能的。 结论 因此,在这里,我需要从基类进行用户定义的转换,而C#拒绝了它。使用方法A,编译器会抱怨,但是代码将在运行时逻辑上起作用。使用方法B,编译器不会抱怨,但是代码显然会在运行时失败。 在这种情况下,我感到奇怪的是,MSDN告诉我不需要此运算符,并且编译器的行为好像是隐式的(方法B)。我应该做些什么? 我知道我可以使用: 解决方案A …
67 c#  casting 

3
为什么Javac允许某些不可能的转换而不允许其他转换?
如果我尝试将a强制转换String为a java.util.Date,则Java编译器会捕获该错误。那么,为什么编译器不将以下内容标记为错误? List<String> strList = new ArrayList<>(); Date d = (Date) strList; 当然,JVM ClassCastException在运行时会抛出a ,但是编译器不会对其进行标记。 该行为与javac 1.8.0_212和11.0.2相同。

6
为什么要声明这种取消引用编译器特定的类型标记指针警告?
我已经阅读了 有关Stack Overflow RE的各种文章 :取消引用类型标记的指针错误。我的理解是,该错误本质上是编译器警告,它警告通过不同类型的指针访问对象的危险(尽管似乎为产生了例外),这是可以理解且合理的警告。 char* 我的问题特定于以下代码:为什么将指针的地址强制转换void**为对此警告有效的指针(通过提升为错误-Werror)? 而且,此代码针对多个目标体系结构进行了编译,只有其中一种会生成警告/错误-这是否暗示它合法地是特定于编译器版本的缺陷? // main.c #include <stdlib.h> typedef struct Foo { int i; } Foo; void freeFunc( void** obj ) { if ( obj && * obj ) { free( *obj ); *obj = NULL; } } int main( int argc, char* argv[] ) { …
38 c  pointers  casting 

6
将2个字节转换为带符号的16位整数的正确方法是什么?
在这个答案中,zwol宣称: 从外部源将两个字节的数据转换为16位带符号整数的正确方法是使用如下辅助函数: #include <stdint.h> int16_t be16_to_cpu_signed(const uint8_t data[static 2]) { uint32_t val = (((uint32_t)data[0]) << 8) | (((uint32_t)data[1]) << 0); return ((int32_t) val) - 0x10000u; } int16_t le16_to_cpu_signed(const uint8_t data[static 2]) { uint32_t val = (((uint32_t)data[0]) << 0) | (((uint32_t)data[1]) << 8); return ((int32_t) val) - 0x10000u; } 上面的哪个函数合适,取决于数组包含小端还是大端表示。字节序不是这里要讨论的问题,我想知道为什么zwol0x10000u从uint32_t转换为的值中减去int32_t。 为什么这是正确的方法? …

1
为什么在C ++中,如果数字为常数,则static_cast <unsigned>为负数会有所不同
等于equal是false的C ++规则是什么?鉴于: float f {-1.0}; bool equal = (static_cast&lt;unsigned&gt;(f) == static_cast&lt;unsigned&gt;(-1.0)); 例如https://godbolt.org/z/fcmx2P #include &lt;iostream&gt; int main() { float f {-1.0}; const float cf {-1.0}; std::cout &lt;&lt; std::hex; std::cout &lt;&lt; " f" &lt;&lt; "=" &lt;&lt; static_cast&lt;unsigned&gt;(f) &lt;&lt; '\n'; std::cout &lt;&lt; "cf" &lt;&lt; "=" &lt;&lt; static_cast&lt;unsigned&gt;(cf) &lt;&lt; '\n'; return 0; } 产生以下输出: …
28 c++  casting 

1
Haskell中的隐式静态类型强制转换(强制)
问题 在Haskell中考虑以下设计问题。我有一个简单的符号EDSL,我想在其中表达变量和一般表达式(多元多项式),例如x^2 * y + 2*z + 1。另外,我想在表达式(例如x^2 + 1 = 1)和定义(例如)上表达某些符号方程式x := 2*y - 2。 目标是: 变量和通用表达式具有单独的类型-某些函数可能会应用于变量,而不是复杂的表达式。例如,定义运算符:=可能是类型, (:=) :: Variable -&gt; Expression -&gt; Definition并且不应该将复杂的表达式作为其左侧参数传递(尽管应该可以将变量作为其右侧参数传递,而无需显式转换) 。 将表达式作为的实例Num,这样就可以将整数文字提升为表达式,并为常见的代数运算(如加法或乘法)使用方便的表示法,而无需引入一些辅助包装运算符。 换句话说,我希望对表达式进行变量的隐式和静态类型转换(强制转换)。现在,我知道这样,Haskell中没有隐式类型强制转换。但是,某些面向对象的编程概念(在这种情况下为简单继承)可以在Haskell的类型系统中表达,无论有没有语言扩展。如何在保持轻量级语法的同时满足以上两个条件?可能吗 讨论区 显然,这里的主要问题是Num类型限制,例如 (+) :: Num a =&gt; a -&gt; a -&gt; a 原则上,可以为变量和表达式编写单个(通用)代数数据类型。然后,可以这样写:=:区分左侧表达式,只接受变量构造函数,否则会出现运行时错误。但是,这不是一个干净的静态(即编译时)解决方案... 例 理想情况下,我想实现一种轻量级语法,例如 computation = do x &lt;- variable t …

2
转换产生无效指针的函数引用?
我正在跟踪第三方代码中的错误,并将其缩小到类似的范围。 use libc::c_void; pub unsafe fn foo() {} fn main() { let ptr = &amp;foo as *const _ as *const c_void; println!("{:x}", ptr as usize); } 在稳定的1.38.0上运行,这会打印函数指针,但是beta(1.39.0-beta.6)和夜间返回'1'。(游乐场) _推断出什么,为什么行为发生了变化? 我认为正确的方法只是foo as *const c_void,但这不是我的代码。
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.