Только что узнал ответ! :)
public object invoke(object obj, long l)
{
if (typeof(B) == typeof(long))
{
if (obj != null)
l = (long)obj;
Func<A, long> x = (Func<A, long>)(object)f;
return x(l);
} else {
return f((B)obj);
}
}
Таким образом, нам не нужно автоматически вставлять long в объект, но мы фактически приводим тип Func для получения указанного нами long!
Что касается того, почему я пытаюсь это сделать, прочитайте приведенный выше комментарий, и я все равно буду пытаться найти лучший способ сделать это.
На данный момент у нас есть следующий код Haxe:
var f:Int->Int->Float = function(x:Int, y:Int) return x + y + 0.5;
var f2:Dynamic->Dynamic->Dynamic = f; // ok
var f3:Dynamic->Int->Dynamic = f; //also ok
f2(10, 30); // ok - this will box the 10 and 30
То, что я пытаюсь сделать, - это создать тип Fun3, который имеет вызов invoke, который будет принимать как упакованные, так и незаписанные аргументы. Если базовая функция действительно принимает распакованные типы, она сначала попытается использовать их.