泛型错误

本文关键字:错误 泛型 | 更新日期: 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);
}