Вот мой код
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, эквивалентный из платформы Объекта) и запись (Объект, возвращенный платформой) для нескольких таблиц/классов. Таким образом, я хотел бы использовать это, чтобы сделать мой класс определенное преобразование
Ваш интерфейс имеет общий ToEntity
метод, который вы сделали не генерическим в своем классе реализации Gens
в виде ToEntity
. (Метод generic может принимать любой тип параметра, возможно, учитывая определенные ограничения для T
. Ваш класс Gens
пытается дать определение для ToEntity
только для параметра типа MyOtherClass
, что отменяет назначение генериков. )
В Вашем примере кода непонятно, как Ваш класс Gens
пытается использовать тип MyOtherClass
; он определенно не участвует в логике ToEntity
. Нам понадобится дополнительная информация, которая поможет вам в дальнейшем.
Чтобы проиллюстрировать, вот что предлагает ваше нынешнее определение интерфейса ITranslator
на простом английском языке:
"Я предоставляю механизм перевода любая запись типа
R
в сущность. типаE
, , этот механизм представляет собой в зависимости от любого указанного пользователем типаT
."
Ваш Gens
класс, с другой стороны, "реализует" приведенный выше интерфейс так:
"Я могу переводить целые числа в строки. Я предоставляю иллюзию, позволяя пользователь должен указать тип для управления как выполняется этот перевод, но на самом деле нет выбора типа. Класс
MyOtherClass
задействован. Каким-то образом; это все, что я могу сказать"
Из этих двух описаний ясно, что класс Gens
на самом деле не делает того, что гарантирует интерфейс ITranslator
. А именно, он не хочет принимать пользовательский тип для своего метода ToEntity
. Поэтому данный код для Вас не скомпилируется.
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
. Поэтому этот код не будет компилироваться для вас.
Необходимо объявить ограничение для базового типа.
public string ToEntity<T>(int record) where T : MyOtherClass
Это компилирует ОК для меня в LinqPad. Может быть, у вас есть тип имени e, r или t где-нибудь?
Ааа, я вижу, что вы пытаетесь сделать ... У вас есть myOthlclass, определяемый как класс где-то, пока вы пытаетесь использовать его в качестве аргументации типа в точечном количестве. Как именно вы хотите MyOthlClass вовлечены в точиство?