casting 相关问题

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

classCastException问题java 21,spring boot v3.2

我隔离的一段代码有问题。它返回给我一个 classCastException。 如果我评论这个块一切正常。 请问你能帮帮我吗? 谢谢 银行账户服务.listCustomers().

回答 1 投票 0

将接受指针类型的函数指针转换为另一个接受引用类型的函数指针是否安全? [重复]

将接受“指针参数”的函数指针转换为另一个接受“引用参数”的函数指针有什么缺点? 考虑以下考试...

回答 1 投票 0

所有 C 编译器在将浮点转换为整数时都会隐式删除小数吗?

我注意到在 GCC 和 Clang 下,当我将 float 值转换为 int 时,后端会执行一些操作将真正的浮点数据转换为整数 - 小数部分被忽略,并且

回答 2 投票 0

创建表时,如果列值超过长度,如何修剪 DDL 中的 varchar -redshift

字符串超过ddl长度错误: 我想使用 ddl 在 redshift 中创建一个表,指定在超出所提到的字符数时进行修剪。有办法吗? 我尝试插入“Cast ...

回答 2 投票 0

为什么通用工厂不能重定向到特定的子类?

下面是一些(当前)无法编译的代码: 密封类 MyValue { 最终ValueT值; const MyValue(this.value); const 工厂 MyValue.bool(bool value) = MyBool; c...

回答 1 投票 0

如何从AssemblyLoadContext加载的对象获取接口

/// /// 这里asm是从HostAssemblyLoadContext加载的 /// /// ///

回答 1 投票 0

类型转换为布尔值

有人可以解释一下为什么会这样吗: var_dump((布尔) 1==2); 回报 布尔(真) 但 var_dump(1==2); 回报 布尔(假) 当然第二次返回是正确的,但是为什么第一次返回 php

回答 6 投票 0

SQL 错误:无关的输入 ')' 期望 AS 接近 '<EOF>'

当我尝试获取month_diff时收到以下错误 外部输入 ')' 期望 AS 接近 '' 这是SQL代码 Months_ Between((cast(min(bs.cpd_dt)) as date),cast(bs.first_prd_cp...

回答 1 投票 0

使用存储库模式将 Eloquent\Collection (Laravel) 转换为 stdClass 数组

我正在尝试按照本文在 Laravel 5 应用程序中实现存储库模式。在其中,存储库实现转换特定数据源的对象(在本例中为 Eloq...

回答 4 投票 0

从函数调用函数

我有以下代码段,用于设置/格式化价格并获取从依赖项升级中重构的值。 我需要将值从表单传递到 amountOnBlur

回答 1 投票 0

字符串、wstring 和 u16string 之间的转换

我的C++模块从NodeJS(node-addon-api)接收一个JSON字符串,然后我使用rapidjson来处理数据,这需要const char*。 但是,对于某些功能(请参阅我之前的任务...

回答 1 投票 0

在 Polar 中流式传输时推断数据类型

我最近收到了一个大于内存的镶木地板文件,其中每一列都是字符串数据类型。我想做类型推断,将可以转换为整数和浮点数的列转换,并且

回答 1 投票 0

如何将整数转换为 std::u16string (C++11)?

没有方法 std::to_u16string(...)。显然 static_cast 似乎不是进行此类转换的最合适方法。 对于相反的转换,从字符串到整数,转换器可能是...

回答 2 投票 0

在 C# 中将 Task<T> 转换为 Task<object>,无需 T

我有一个充满扩展方法的静态类,其中每个方法都是异步的并返回一些值 - 像这样: 公共静态类 MyContextExtensions{ 公共静态异步任务 我有一个充满扩展方法的静态类,其中每个方法都是异步的并返回一些值 - 像这样: public static class MyContextExtensions{ public static async Task<bool> SomeFunction(this DbContext myContext){ bool output = false; //...doing stuff with myContext return output; } public static async Task<List<string>> SomeOtherFunction(this DbContext myContext){ List<string> output = new List<string>(); //...doing stuff with myContext return output; } } 我的目标是能够从另一个类中的单个方法调用这些方法中的任何一个,并将其结果作为对象返回。它看起来像这样: public class MyHub: Hub{ public async Task<object> InvokeContextExtension(string methodName){ using(var context = new DbContext()){ //This fails because of invalid cast return await (Task<object>)typeof(MyContextExtensions).GetMethod(methodName).Invoke(null, context); } } } 问题是转换失败。我的困境是我无法将任何类型参数传递给“InvokeContextExtension”方法,因为它是 SignalR 中心的一部分并且由 javascript 调用。在某种程度上,我不关心扩展方法的返回类型,因为它只会序列化为 JSON 并发送回 javascript 客户端。但是,我确实必须将 Invoke 返回的值转换为任务才能使用等待运算符。我必须为该“任务”提供一个通用参数,否则它将把返回类型视为 void。因此,这一切都归结为如何成功地将具有通用参数 T 的任务转换为具有对象通用参数的任务,其中 T 表示扩展方法的输出。 您可以分两步完成 - await使用基类执行任务,然后使用反射或dynamic收获结果: using(var context = new DbContext()) { // Get the task Task task = (Task)typeof(MyContextExtensions).GetMethod(methodName).Invoke(null, context); // Make sure it runs to completion await task.ConfigureAwait(false); // Harvest the result return (object)((dynamic)task).Result; } 这是一个完整的运行示例,它将上述通过反射调用 Task 的技术置于上下文中: class MainClass { public static void Main(string[] args) { var t1 = Task.Run(async () => Console.WriteLine(await Bar("Foo1"))); var t2 = Task.Run(async () => Console.WriteLine(await Bar("Foo2"))); Task.WaitAll(t1, t2); } public static async Task<object> Bar(string name) { Task t = (Task)typeof(MainClass).GetMethod(name).Invoke(null, new object[] { "bar" }); await t.ConfigureAwait(false); return (object)((dynamic)t).Result; } public static Task<string> Foo1(string s) { return Task.FromResult("hello"); } public static Task<bool> Foo2(string s) { return Task.FromResult(true); } } 一般来说,要将 Task<T> 转换为 Task<object>,我会简单地采用简单的连续映射: Task<T> yourTaskT; // .... Task<object> yourTaskObject = yourTaskT.ContinueWith(t => (object) t.Result); (文档链接在这里) 但是,您实际的具体需求是 通过反射调用 Task 并获取其(未知类型)结果 。 为此,您可以参考完整的dasblinkenlight的答案,它应该适合您的具体问题。 我想提供一个实现,恕我直言,这是早期答案的最佳组合: 精确的参数处理 无动态调度 通用扩展方法 给你: /// <summary> /// Casts a <see cref="Task"/> to a <see cref="Task{TResult}"/>. /// This method will throw an <see cref="InvalidCastException"/> if the specified task /// returns a value which is not identity-convertible to <typeparamref name="T"/>. /// </summary> public static async Task<T> Cast<T>(this Task task) { if (task == null) throw new ArgumentNullException(nameof(task)); if (!task.GetType().IsGenericType || task.GetType().GetGenericTypeDefinition() != typeof(Task<>)) throw new ArgumentException("An argument of type 'System.Threading.Tasks.Task`1' was expected"); await task.ConfigureAwait(false); object result = task.GetType().GetProperty(nameof(Task<object>.Result)).GetValue(task); return (T)result; } 您不能将 Task<T> 转换为 Task<object>,因为 Task<T> 不是协变的(也不是逆变的)。最简单的解决方案是使用更多反射: var task = (Task) mi.Invoke (obj, null) ; var result = task.GetType ().GetProperty ("Result").GetValue (task) ; 这很慢且效率低下,但如果不经常执行此代码则可用。顺便说一句,如果您要阻塞等待其结果,那么异步 MakeMyClass1 方法有什么用呢? 另一种可能性是为此目的编写一个扩展方法: public static Task<object> Convert<T>(this Task<T> task) { TaskCompletionSource<object> res = new TaskCompletionSource<object>(); return task.ContinueWith(t => { if (t.IsCanceled) { res.TrySetCanceled(); } else if (t.IsFaulted) { res.TrySetException(t.Exception); } else { res.TrySetResult(t.Result); } return res.Task; } , TaskContinuationOptions.ExecuteSynchronously).Unwrap(); } 它是非阻塞解决方案,将保留任务的原始状态/异常。 最有效的方法是自定义等待者: struct TaskCast<TSource, TDestination> where TSource : TDestination { readonly Task<TSource> task; public TaskCast(Task<TSource> task) { this.task = task; } public Awaiter GetAwaiter() => new Awaiter(task); public struct Awaiter : System.Runtime.CompilerServices.INotifyCompletion { System.Runtime.CompilerServices.TaskAwaiter<TSource> awaiter; public Awaiter(Task<TSource> task) { awaiter = task.GetAwaiter(); } public bool IsCompleted => awaiter.IsCompleted; public TDestination GetResult() => awaiter.GetResult(); public void OnCompleted(Action continuation) => awaiter.OnCompleted(continuation); } } 具有以下用法: Task<...> someTask = ...; await TaskCast<..., object>(someTask); 这种方法的局限性在于结果不是 Task<object> 而是一个可等待的对象。 我根据dasblinkenlight的回答做了一个小小的扩展方法: public static class TaskExtension { public async static Task<T> Cast<T>(this Task task) { if (!task.GetType().IsGenericType) throw new InvalidOperationException(); await task.ConfigureAwait(false); // Harvest the result. Ugly but works return (T)((dynamic)task).Result; } } 用途: Task<Foo> task = ... Task<object> = task.Cast<object>(); 这样您就可以将 T 中的 Task<T> 更改为您想要的任何内容。 对于最佳方法,不使用反射和动态丑陋语法,也不传递泛型类型。我将使用两种扩展方法来实现这个目标。 public static async Task<object> CastToObject<T>([NotNull] this Task<T> task) { return await task.ConfigureAwait(false); } public static async Task<TResult> Cast<TResult>([NotNull] this Task<object> task) { return (TResult) await task.ConfigureAwait(false); } 用途: Task<T1> task ... Task<T2> task2 = task.CastToObject().Cast<T2>(); 这是我的第二种方法,但不推荐: public static async Task<TResult> Cast<TSource, TResult>([NotNull] this Task<TSource> task, TResult dummy = default) { return (TResult)(object) await task.ConfigureAwait(false); } 用途: Task<T1> task ... Task<T2> task2 = task.Cast((T2) default); // Or Task<T2> task2 = task.Cast<T1, T2>(); 这是我的第三种方法,但是不推荐:(类似于第二种) public static async Task<TResult> Cast<TSource, TResult>([NotNull] this Task<TSource> task, Type<TResult> type = null) { return (TResult)(object) await task.ConfigureAwait(false); } // Dummy type class public class Type<T> { } public static class TypeExtension { public static Type<T> ToGeneric<T>(this T source) { return new Type<T>(); } } 用途: Task<T1> task ... Task<T2> task2 = task.Cast(typeof(T2).ToGeneric()); // Or Task<T2> task2 = task.Cast<T1, T2>(); 将 await 与动态/反射调用混合使用并不是一个好主意,因为 await 是一条编译器指令,它会围绕调用的方法生成大量代码,并且使用更多反射来“模拟”编译器工作并没有真正的意义,延续、包装等 因为您需要的是在运行时管理代码,然后忘记在编译时工作的 asyc await 语法糖。重写 SomeFunction 和 SomeOtherFunction 而不使用它们,并在运行时创建的您自己的任务中开始操作。您将得到相同的行为,但代码非常清晰。

回答 8 投票 0

BigQuery - 使用 Left Join 和 Cast 函数更新表(语法错误:意外的关键字 CAST)

在 BigQuery 中,我尝试从另一个具有列“SB”的表 t2 更新表 t1 中具有所有空值的列“PSB”。问题出在进行左连接时的关键数据字段。数据...

回答 1 投票 0

Java泛型和instanceof

想知道如何使用 Java 泛型正确执行条件转换。 我的示例中的第一个castTo方法似乎是最明显的,但它给了我一个编译时错误A无法转换为T并且我

回答 1 投票 0

为什么此代码即使在强制转换时也会溢出?

我正在准备涉及 C 的考试,但即使在转换变量时我也会遇到变量错误。代码是从教授给我们的PowerPoint中复制的。 我正在经历...

回答 1 投票 0

com.google.gson.internal.LinkedTreeMap 无法转换为我的类[重复]

我在从 JSON 字符串获取对象时遇到一些问题。 我得到了产品类 公开课产品{ 私有字符串 mBarcode; 私有字符串 mName; 私有字符串 mPrice; ...

回答 10 投票 0

使用CAST将Varchar转换为Int时的获取和错误

我正在编写一个查询来计算出拍摄过多部电影的电影导演的数量。我已经获取了子查询的值,但是当我运行它时,我收到错误“转换失败,当

回答 1 投票 0

如何在 C++11 constexpr 中检查双精度位模式是否为 0x0?

我想检查给定的双精度/浮点变量是否具有实际的位模式 0x0。不要问为什么,它用在 Qt 中的一个函数(qIsNull())中,我想将其设置为 constexpr。 原始代码使用了...

回答 4 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.