泛型错误
本文关键字:错误 泛型 | 更新日期: 2023-09-27 18:24:42
我的c#有问题。我正在尝试使一些java代码工作
我有这种方法`
public static E JobFromJson <E, I, T, K>(String json, TaskType task) where E : Job<I, T, K>
{
return JsonConvert.DeserializeObject<Task.GetJob (task)> (json);
}
"return JsonConvert.DeserializeObject(json)"应该返回一个扩展Job的E类型的对象Task.GetJob(Task)应该返回一个扩展Job 的特定类型
代码没有编译,我收到以下错误:
在方法定义中:类型"I"不能用于泛型类型或方法"SagaApi.Job"中的类型参数"I"。没有从"I"到SagaApi的装箱或参数转换。项目
在声明中:无法根据用法推断方法"SagaApi.Task.GetJob(SagaApi.TaskType)"的类型参数。尝试显式指定类型参数
当我从类SagaApi调用方法时也是如此。我这样做的工作:
public static E FromJson<E, A, B, C> (String json, TaskType taskType) where E : Job<A, B, C>
{
return Task.JobFromJson (json, taskType);
}
我得到相同的错误
在java中,代码(我没有做)看起来是这样的:
@SuppressWarnings("unchecked")
public <E extends Job<?, ?>> E jobFromJson(String json)
{
return (E)new Gson().fromJson(json, this.jobClass);
}
你知道我做错了什么吗?怎么解决?
非常感谢。
Edit:这就是Task类的样子。我还没有制定完整的GetJob(任务)方法,但它将是这样的:
namespace SagaAPI
{
public static class Task
{
/**
* Obtain the {@link Job} from the json
* @param json the json string
* @return the {@link Job} object
*/
public static E Job<E, I, T, K> JobFromJson<I, T, K> (string json, TaskType task) where E : Job<I, T, K>
{
return JsonConvert.DeserializeObject<Task.GetJob (task)> (json);
}
/**
* Obtain the {@link AnswerContainer} from the json
* @param json the json string
* @return the {@link AnswerContainer} object
*/
public static E AnswerFromJson <E, K> (String json, TaskType task) where E : AnswerContainer<K>
{
return (E) JsonConvert.DeserializeObject<Task.GetAnswer (task)> (json);
}
private static Type GetJob<I, T, K> (TaskType task)
{
if (task == TaskType.RELATION)
return typeof (ConceptJob<I, T, K>);
else if (task == TaskType.COLOR)
return typeof (AnnotationJob<I, T, K>);
else
return typeof (ValidationJob<I, T, K>);
}
private static Type GetAnswer<K> (TaskType task)
{
//TODO
}
}
}
首先,如果编译器无法从参数或返回值中获得泛型参数,那么在调用泛型函数时应该传递泛型参数,所以这里是
Task.GetJob (task)
应该是
Task.GetJob<I, T, K>(task)
接下来,不能将类型变量作为泛型类型参数传递,但可以使用像这样的反射
public static E JobFromJson <E, I, T, K>(String json, TaskType task) where E : Job<I, T, K>
{
var method= typeof(JsonConvert).GetMethods(BindingFlags.Static | BindingFlags.Public).Where(m=>m.Name == "DeserializeObject" && m.GetGenericArguments().Length==1 && m.GetParameters().Length==1).Single();
var concreteMethod = method.MakeGenericMethod(Task.GetJob<I, T, K>(task));
return (E)concreteMethod.Invoke(null, new object[]{json});
}
我像这个一样修复了它
public static Job<I, T, K> JobFromJson<I, T, K> (string json, TaskType task) where I : Item where T : AnswerContainer<K>
基本上,我应该在作业类中再次指定每个通用类型
感谢大家
假设Task.GetJob(task)
returns
Job<I, T, K>
您的签名应该是:
public static Job<I, T, K> JobFromJson<I, T, K>(string json, TaskType task)
{
return JsonConvert.DeserializeObject<Task.GetJob<I, T, K>(task)> (json);
}