При использовании зависимых от пути типов с отражением я получаю ошибку несоответствия типа, хотя у меня есть соответствующие «базовые типы». Каковы эти «не-базовые типы» и почему они проверяются вместо «базовых типов»?Типы, зависящие от пути, и «базовые типы», какие из них проверены?
В приведенном ниже коде я хочу, чтобы метод compare
принимал в качестве аргументов только подклассы того же типа. Ошибка находится на последней строке.
abstract class A(val a:Int) {
type Impl <: A
def compare(other:Impl) {
if(a==other.a) println("equal") else println("diff")
}
}
class B(a:Int) extends A(a) {type Impl = B}
object Test {
def newInst(a: Int, className: String) = {
val constr = Class.forName(className).getConstructors()(0)
constr.newInstance(a.asInstanceOf[AnyRef]).asInstanceOf[A]
}
def main(args: Array[String]) {
val b1 = newInst(4, "B")
val b2 = newInst(5, "B")
b1.compare(b2) // type mismatch error here
}
}
В последней строке я получаю эту ошибку:
error: type mismatch;
found : b2.type (with underlying type A)
required: b1.Impl
Поскольку тип b2 такой же, как тип b1 (который А), я ожидал, что это не приводит к ошибке , По некоторым причинам эти зависимые от пути типы отличаются от «базовых типов» при использовании отражения. Зачем?
Если я не использую отражение, это работает:
val b1 = new B(4)
val b2 = new B(5)
b1.compare(b2) // no errors
(мне нужно использовать отражение в моем случае). Может ли newInst()
вернуть объект как класс «B», используя отражение? Это поможет? Существует ли стирание типа при использовании абстрактных типов?
Это единственная ссылка, которую я нашел (on this forum) примерно с той же ошибкой, но это может быть не связано.
Благодарим за вопрос! Это было действительно странно и взяло меня на день, чтобы найти обходной путь и, наконец, увидел ваш пост. –