Универсальные интерфейсы

Вот мой код

public interface ITranslator<E, R>
{       
    E ToEntity<T>(R record);
}

class Gens : ITranslator<string, int>
{
    #region ITranslator<string,int> Members

    public string ToEntity<MyOtherClass>(int record)
    {
        return record.ToString();
    }

    #endregion
}

Когда я компилирую это, я получаю ошибку Type parameter declaration must be an identifier not a type

Почему то, что я не могу иметь ToEntity<MyOtherClass> но может только иметь ToEntity<T> ??

Править: что MyOtherClass выполнение? Я преобразовываю между объектами (POCOs, эквивалентный из платформы Объекта) и запись (Объект, возвращенный платформой) для нескольких таблиц/классов. Таким образом, я хотел бы использовать это, чтобы сделать мой класс определенное преобразование

6
задан ram 30 January 2010 в 02:35
поделиться

3 ответа

Ваш интерфейс имеет общий ToEntity метод, который вы сделали не генерическим в своем классе реализации Gens в виде ToEntity. (Метод generic может принимать любой тип параметра, возможно, учитывая определенные ограничения для T. Ваш класс Gens пытается дать определение для ToEntity только для параметра типа MyOtherClass, что отменяет назначение генериков. )

В Вашем примере кода непонятно, как Ваш класс Gens пытается использовать тип MyOtherClass; он определенно не участвует в логике ToEntity. Нам понадобится дополнительная информация, которая поможет вам в дальнейшем.

Чтобы проиллюстрировать, вот что предлагает ваше нынешнее определение интерфейса ITranslator на простом английском языке:

"Я предоставляю механизм перевода любая запись типа R в сущность. типа E, , этот механизм представляет собой в зависимости от любого указанного пользователем типа T."

Ваш Gens класс, с другой стороны, "реализует" приведенный выше интерфейс так:

"Я могу переводить целые числа в строки. Я предоставляю иллюзию, позволяя пользователь должен указать тип для управления как выполняется этот перевод, но на самом деле нет выбора типа. Класс MyOtherClass задействован. Каким-то образом; это все, что я могу сказать"

Из этих двух описаний ясно, что класс Gens на самом деле не делает того, что гарантирует интерфейс ITranslator. А именно, он не хочет принимать пользовательский тип для своего метода ToEntity. Поэтому данный код для Вас не скомпилируется.

9
ответ дан 9 December 2019 в 20:43
поделиться
URLDecoder.decode(url);//deprecated
URLDecoder.decode(url, "UTF-8"); //use this instead

См. связанный вопрос Как непобег URL-адреса на Java?

-121--1114880-

Ваш интерфейс имеет универсальный метод ToEntity < T > , который вы сделали неродовым в классе реализации Gens как ToEntity < MyOtherClass > (Метод generic может принимать любой параметр типа, возможно, учитывая определенные ограничения для T . Класс Gens пытается предоставить определение для ToEntity только для параметра типа MyOtherClass , который не соответствует назначению дженериков.)

В примере кода неясно, как класс Gens пытается использовать тип MyOtherClass это, конечно, не участвует в логике ToEntity . Нам нужна дополнительная информация, чтобы направлять вас дальше.

Для иллюстрации приведите текущее определение интерфейса ITranslator < E, R > на английском языке:

"Я предоставляю механизм перевода любая запись типа R в сущности типа E , этого механизма быть зависит от любого указанного пользователем типа T «.

Ваш класс Gens , с другой стороны, пути он в настоящее время разработан,» реализует «вышеуказанный интерфейс так:

» Я могу перевести целые числа в последовательности. Я предоставляю иллюзию разрешения пользователь должен указать тип для управления как выполняется этот перевод, но на самом деле выбора типа нет. Используется класс MyOtherClass каким-то образом; Это все, что я могу сказать. "

Из этих двух описаний ясно, что класс Gens на самом деле не делает то, что гарантирует интерфейс ITranslator < E, R > . А именно, он не желает принимать указанный пользователем тип для своего метода ToEntity . Поэтому этот код не будет компилироваться для вас.

-121--4244664-

Необходимо объявить ограничение для базового типа.

public string ToEntity<T>(int record) where T : MyOtherClass
2
ответ дан 9 December 2019 в 20:43
поделиться

Это компилирует ОК для меня в LinqPad. Может быть, у вас есть тип имени e, r или t где-нибудь?

Ааа, я вижу, что вы пытаетесь сделать ... У вас есть myOthlclass, определяемый как класс где-то, пока вы пытаетесь использовать его в качестве аргументации типа в точечном количестве. Как именно вы хотите MyOthlClass вовлечены в точиство?

1
ответ дан 9 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: