С небольшими изменениями ваш пример кода компилируется с помощью valac.
namespace Animals
{
public interface Animal {
public abstract void say_something();
}
public abstract class Canine : Animal {
public void say_something(){
stdout.printf("Woof!");
}
}
public interface AnimalSpecialist<T> {
}
public interface DogSpecialist<T> : AnimalSpecialist<T> {
}
}
Единственное, что Vala не поддерживает, это ограничения параметров типа (where T …
).
Кроме того, поддерживается как параметрический, так и полиморфизм подтипов.
Следует всегда иметь в виду, что код Vala напрямую транслируется в код C, поэтому вы заметите некоторые ограничения параметрического полиморфизма, особенно при использовании обобщенных типов с необнуляемыми типами значений.
Я не могу комментировать дисперсию (ковариацию и контравариантность) и то, как это обрабатывается.