Я столкнулся с этой проблемой при обновлении до сервера Windows 7 с некоторыми устаревшими приложениями CLASP. Попытка запустить 32-битное приложение на 64-битной машине.
Попробуйте настроить пулы приложений на 32-разрядную совместимость на True и / или создать dsn в 32 и 64 бит.
Откройте окно источника данных odbc в обеих версиях из окна запуска. C: \ Windows \ SysWOW64 \ odbcad32.exe C: \ Windows \ system32 \ odbcad32.exe
Я могу ошибаться, но достаточно взглянуть на определение самой функции:
def test(x: X[_]): X[_ <: F] = x
единственная информация, которую дает экзистенциальный тип, - это то, что что-то существует. и с помощью этой сигнатуры вы пытаетесь «сузить» результат функции
, чтобы показать его на практическом примере. скажем, у вас есть что-то вроде этого:
def test(x: Option[_]): Option[_ <: String]
и затем вы называете это проходящим внутри Option[Int]
. Вы ожидаете, что это назначение будет правильным?
val result: Option[_ <: String] = test(Some(1): Option[_])
Это назначение не является действительно проблематичным, и компилятор даже в некотором роде знает об этом, потому что следующая реализация компилируется без проблем:
trait F
trait X[A <: F]
def test(x: X[_]): X[_ <: F] = x match { case q: X[t] => q }
Если вы дадите контролеру типов некоторую слабость, позволив Выведите более точные границы для переменной типа t
, в конечном итоге выяснится, что t
должен быть подтипом F
, а затем позволит вам вернуть значение q
(которое совпадает с x
) без жалоб. Он не делает этого по умолчанию по некоторым нелогичным причинам , что , вероятно, как-то связано с совместимостью с подстановочными символами Java .
(Снова восстановлено; мое первоначальное предположение не показалось слишком далеким, и, учитывая ссылку Дмитрия Митина , по сравнению с ним оно даже не выглядит слишком расплывчатым.) [ 1112]