Как языки Scala, которым нужны ковариантные возвращаемые типы и «реальная» дисперсия класса, работают в CLR? - PullRequest
9 голосов
/ 20 июля 2011

CLR не поддерживает ковариантные возвращаемые типы или полная дисперсия (т. Е. Применяется к классам, а не только к интерфейсам и делегатам), но существуют языки, ориентированные на CLR, которые используют один или обе эти функции.

Есть ли какой-нибудь практический обходной путь для CLR, чтобы включить эту функцию, или эти языки используют какую-то технику переписывания / стирания / ... для полной поддержки их набора функций?

1 Ответ

13 голосов
/ 20 июля 2011

Вероятно, так же, как это делает Java (Java 5 поддерживает ковариантные возвраты на уровне языка, но JVM не поддерживает его): путем добавления синтетических методов. Вот как это делает Java: скажем, у вас есть такой класс:

class Foo implements Cloneable {
    @Override
    public Foo clone() {
        // ...
    }
}

За кулисами генерируются два clone метода: public Foo clone() (который содержит реальный код) и public Object clone() (который просто возвращает результат первого). Последний метод (который синтезируется) - это способ переопределения метода clone на уровне JVM.

...