0

Я использую компилятор Dart2JS версии 1.0.0_r30798 (STABLE).Компилятор Dart2JS не может скомпилировать код. Является ли эта ошибка, функция или ограничение?

Пример кода (только для введения проблемы):

Реальный код здесь (теперь с поправкой на поведение dart2js): https://github.com/mezoni/queries/blob/master/lib/src/queries/lookup.dart

Это часть Queryable collections for Dart language.

class ILookup<TKey, TElement> implements IEnumerable<IGrouping<TKey, TElement>> { 
} 

class Lookup<TKey, TElement> extends Object with Enumerable implements ILookup<TKey, TElement> { 
} 

class IEnumerable<T> implements HasIterator<T> { 
} 

class HasIterator<T> { 
} 

class IGrouping<TKey, TElement> implements IEnumerable<TKey> { 
} 

class Enumerable<T> implements IEnumerable<T> { 
} 

void main() { 
    var obj = new Lookup(); 
    print(obj); 
} 

Этот код создает следующую ошибку Google Дарта dart2js Компилятор:

Internal Error: Inheritance of the same class with different type arguments is not 
supported: Both HasIterator<dynamic> and HasIterator<IGrouping<TKey, TElement>> are 
supertypes of Lookup<TKey, TElement>. 
class Lookup<TKey, TElement> extends Object with Enumerable implements ILookup<TKey, 
TElement> { 

^^^^^ 
Error: Compilation failed. 

То есть, dart2js компилятор не может скомпилировать этот код.

Итак, я не могу понять: «Это ошибка, функция или ограничение?».

+3

Невозможно дать разумный ответ на этот вопрос, поскольку он содержит в основном случайные тирады (как обычно) и не предоставляет никакой информации о ожидаемом результате. «Я хочу, чтобы компилятор компилировал некоторые случайные символы, на самом деле не вопрос». –

+0

Я сделал небольшое редактирование 'с Enumerable impl', но поскольку вы не предоставили никакой информации, кроме' Я хочу, чтобы это скомпилировать', я не могу знать, какой параметр типа следует использовать здесь, поэтому я взял один случайный случай. –

+0

Этот код соответствует спецификации языка. Это не потребовало вашего редактирования. – mezoni

ответ

1

Ответ от Dart Team очень хорошо.

«Поведение VM правильное, и dart2js еще не реализует его».

https://code.google.com/p/dart/issues/detail?id=16047#c5

также ответ от Гилада Браха.

«FWIW, спецификация не имеет такого ограничения» (RE: class реализует интерфейс с двумя различными параметрами типа).

https://code.google.com/p/dart/issues/detail?id=14729#c2

Также очень хорошо отметил:

«К сожалению, это намеренное ограничение в dart2js на данный момент реализация того же интерфейса с различными аргументами типа имеет никогда не работал, так что мы чувствовали себя очень неудобно иметь людей. зависят от нарушенного поведения ».

https://code.google.com/p/dart/issues/detail?id=14729#c3

Этот ответ полностью вписывается в том, что образец кода в исходный вопрос правильно, и она не может быть скомпилирован в настоящее время с помощью dart2js.

P.S.

Мои мысли (мои джемперы):

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

Я думаю, что в этом случае HasIterator<dynamic> и HasIterator<IGrouping<TKey, TElement>> не одни и те же типы (даже они одни и те же классы), потому что они оба только косвенно указывает нижнюю и верхнюю границы TElement параметра HasIterator<TElement>.

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

Они не одни и те же типы, потому что это выражение верно:

HasIterator<dynamic> != HasIterator<IGrouping<TKey, TElement>> 

Они не конфликты (но неявно определяет нижний и верхний пределы), потому что один из следующих выражений верно.

HasIterator<dynamic> is HasIterator<IGrouping<TKey, TElement>> 
HasIterator<IGrouping<TKey, TElement>> is HasIterator<dynamic> 

наш случай (неявный) нижняя граница dynamic и (неявно) верхний bound является <IGrouping<TKey, TElement>.

implicit термин означает только resolved at compile time.

Это означает, что один из них является подтипом другого, и компилятор должен разрешить их использование в декларации. А в аннотациях типа компилятор должен проверять параметры совместимости с обоими из них (включая другие супер интерфейсы).

Если Dart2JS будет более тщательно проверять супертипы, он может обойти эту проблему.

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

+0

У вас иногда есть ценные мнения и вопросы, запеченные в ваших тирадах, а иногда и оскорбительные посты. Было бы здорово, если бы вы могли также уважать мнения других народов так же, как вы ожидаете, что другие уважают вас, не оскорбляя их. Если бы вы могли просто пройти мимо, я считаю, что вы могли бы быть весьма полезны для сообщества Дарт, а не то, что многие сейчас находят только раздражающими. – ronag

+0

ronag, я думаю, было бы лучше, если бы это было запрещено (как вы упомянули раньше). Но разработчики обнаружили, что это допустимо в необязательно типизированном языке Dart позволяют реализовать интерфейс с двумя разными (но соответствующими параметрами) параметрами типа. – mezoni

2

Во-первых, dart2js НЕ является компилятором VM Dart, к которому относится спецификация языка. Поскольку Dart VM и Javascript - разные языки, может произойти различное поведение или ограничения в очень абстрактных случаях. Они не должны, но они это делают.

Это, как говорится, я не понимаю, почему этот код может работать в виртуальной машине в первую очередь. По всему, что я знаю, о наследовании и Mixins в Dart, ваше определение Lookup должно выглядеть следующим образом:

class Lookup<TKey, TElement> extends Object with Enumerable<IGrouping<TKey, TElement>> implements ILookup<TKey, TElement>` 

Потому что в противном случае, как говорится в сообщении об ошибке, вы унаследовали бы HasIterator два раза с разными параметрами типа, что, конечно, немного проблема - если вы, наконец, добавите методы в HasIterator, какой из этих двух должен быть вызван? method1(dynamic) или method1(IGrouping<TKey, TElement>)?

+0

MarioP: «Итак, есть ли ошибка в Dart VM? Наверное, да». Это не ошибка. Вот ответ на ваш вопрос, ваш текущий ответ и вашу проблему: https://code.google.com/p/dart/issues/detail?id=16047#c5. Короче говоря: «Поведение VM правильное, и dart2js еще не реализует его». – mezoni

+0

@mezoni Ваша точка бытия? Я могу согласиться с тем, что VM работает так, как было разработано. Я этого не ожидал, и я все еще смущен (см. Последующий пост в самой ссылке, которую вы опубликовали), но дело в том, что с самого начала я писал: «Различное поведение или ограничения [...] могут случиться ». Вам предоставили обходной путь, но вместо этого решили обсудить, почему это не нужно. Вы не искали помощи, но для обсуждения, совершенно бесполезного на SO и более подходящего для досок объявлений и форумов. Честно говоря, я мог представить, что именно по этой причине многие из ваших вопросов больше не получают полезных ответов. – MarioP

+0

Кроме того, я вернул ответ обратно в исходное состояние и удалил объективно неправильное изменение, которое я добавил. – MarioP

 Смежные вопросы

  • Нет связанных вопросов^_^