Обобщенный метод может использовать контравариантные/ковариантные типы?

Я пишу обобщенный метод, чтобы использовать его в специальной задаче на шаблоне T4. Метод должен позволить мне использовать специализированные типы из общего интерфейса. Я подумал о следующих сигнатурах:

interface IGreatInterface {
    Object aMethodAlpha<U>(U parameter) where U : IAnInterface;
    Object aMethodBeta(IAnInterface parameter)
}

public class AnInterestingClass : IAnInterface{}

Когда я пытаюсь реализовать IGreatInterface, компилятор выдает ошибку для aMethodBeta(), потому что я заставил свой T4 написать этот метод, используя подтип IAnInterface (т.е. я хочу реализовать этот метод следующим образом: Object aMethodBeta(AnInterestingClass parameter)).

Метод aMethodAlpha() может быть использован, но не так чисто, как я хочу, потому что мой T4 должен генерировать дополнительный код. Я (возможно, ошибочно) предлагаю, что реализация этого метода, которая должна быть выполнена T4, могла бы быть
Object aMethodAlpha(AnInterestingClass parameter).

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

  1. Должен ли общий метод использовать точный тип при реализации?
  2. Есть ли какой-нибудь трюк, чтобы изменить это поведение?
8
задан JPCF 2 March 2016 в 16:26
поделиться