2014-02-07 4 views
6

Я наткнулся на недоумение поведения Type.=:= при применении на типе рефинансирования. Рассмотрим:Уточнение структурного типа и равенство типов

import reflect.runtime.universe._ 
type T1 = AnyRef { 
    def apply(name: String): Unit 
    def foo: String 
} 

type Base = { def apply(name: String): Unit } 
type T2 = Base { 
    def foo: String 
} 

Учитывая, что Base является псевдонимом для типа уточнения, я бы ожидал, что его совершенствования путем добавления элемента foo бы выход такого же типа, как если бы я определил foo прямо в Base.

Или, другими словами, я ожидал бы, что T1 и T2 обозначают полностью эквивалентные типы.

По большей части, скалак, похоже, согласен. К примеру, я могу передать экземпляр T2, где, как ожидается, экземпляр T1:

def f(x: T1){} 
f(null: T2) // scalac does not complain here 

И наоборот:

def g(x: T2){} 
g(null: T1) // scalac is still happy 

Я также могу попросить свидетельство T1 =:= T2 и компилирует тоже хорошо:

implicitly[T1 =:= T2] 

Однако, используя scala reflection I ge т совершенно разные результаты:

scala> typeOf[T1] =:= typeOf[T2] 
res2: Boolean = false 

Так это отражение ошибка Scala (я так думаю), или есть фундаментальная причина (техническая в противном случае), почему typeOf[T1] =:= typeOf[T2] возвратит ложь?

+0

'TYPEOF [T1] <:

+0

Это замечательное наблюдение. По крайней мере, существует некоторая * согласованность. Другое замечательно, что, по крайней мере, это дает мне обходной путь: я могу просто проверить для '(typeOf [T1] <:

ответ

4

К сожалению, это выглядит эта ошибка: https://issues.scala-lang.org/browse/SI-8177

С положительной стороны ... это похоже, что активно работают в стадии реализации, чтобы исправить это :)

+0

+1 для указания на связанные ошибки. Но я не уверен, что это ошибка, с которой я сталкиваюсь. SI-8177 касается зависимых типов и недопустимой обработки префиксов типа. Единственный способ, которым я могу думать, что это влияет на мой выше фрагмент кода, - это то, что мои псевдонимы типов имеют разные префиксы. Это действительно так в REPL, но я попытался обернуть все определения в одном и том же объекте (=> тот же префикс), и я все равно получаю ту же ошибку. Возможно, хотя это исправление SI-8177 устранит мою проблему как побочный эффект. Я попробую с 2.11.0-RC1, когда он исчезнет, ​​и если он будет исправлен, я подтвержу ваш ответ. –

+0

OK, scala 2.11.0-RC1 только что был выпущен, поэтому я попытался (см. Как SI-8177 отмечен как исправленный в scala 2.11.0-RC1). Ошибка там все еще есть, так как я подозревал, что SI-8177 не охватывает мою описанную проблему. Может быть, пришло время открыть билет. –

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

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