}
}
class Collections
{
    public static function sort(GenericList $list, $func = null)
    {
        if (empty($func)) {
            return sort($list->toArray());
        } else {
            return usort($list->toArray(), $func);
        }
    }
    public static function unmodifiableCollection(Collection $c)
    {
        return new UnmodifiableCollection($c);
    }
    public static function unmodifiableList(GenericList $l)
    {
        return new UnmodifiableList($l);
    }
    public static function unmodifiableSet(Set $s)
    {
        return new UnmodifiableSet($s);
    }
    public static function unmodifiableMap(Map $m)
    {
        return new UnmodifiableMap($m);
    }
}
Classes::registerAlias('List', Classes::classOf('GenericList'));
Classes::register('double', new JavaPrimitiveClazz(Double::TYPE, Double::SIGNATURE));
Classes::register('void', new JavaPrimitiveClazz(Void::TYPE, Void::SIGNATURE));
$objClass = Classes::classOf('Object');
Classes::register('Boolean', new JavaClazz('Boolean', $objClass));
Classes::register('Byte', new JavaClazz('Byte', $objClass));
Classes::register('Long', new JavaClazz('Long', $objClass));
Classes::register('Short', new JavaClazz('Short', $objClass));
Classes::register('Integer', new JavaClazz('Integer', $objClass));
Classes::register('Character', new JavaClazz('Character', $objClass));
Classes::register('String', new JavaClazz('String', $objClass));
Classes::register('Float', new JavaClazz('Float', $objClass));
Classes::register('Double', new JavaClazz('Double', $objClass));
Classes::register('Void', new JavaClazz('Void', $objClass));
// Aliases
Classes::registerAlias('string', String::clazz());
Classes::registerAlias('bool', Boolean::typeClass());
// Signatures
Classes::registerSignature(Boolean::SIGNATURE, Boolean::typeClass());
Classes::registerSignature(Byte::SIGNATURE, Byte::typeClass());
Classes::registerSignature(Character::SIGNATURE, Character::typeClass());
Classes::registerSignature(Double::SIGNATURE, Double::typeClass());
Classes::registerSignature(Float::SIGNATURE, Float::typeClass());
Classes::registerSignature(Integer::SIGNATURE, Integer::typeClass());
Classes::registerSignature(Long::SIGNATURE, Long::typeClass());
Classes::registerSignature(Short::SIGNATURE, Short::typeClass());
// Assignable From
Long::typeClass()->registerAssignableFrom(array(Double::typeClass(), Integer::typeClass(), Character::typeClass(), Short::typeClass(), Byte::typeClass()));
Integer::typeClass()->registerAssignableFrom(array(Character::typeClass(), Short::typeClass(), Byte::typeClass()));
Character::typeClass()->registerAssignableFrom(array(Integer::typeClass(), Short::typeClass(), Byte::typeClass()));
Short::typeClass()->registerAssignableFrom(array(Integer::typeClass(), Byte::typeClass()));
Byte::typeClass()->registerAssignableFrom(array(Integer::typeClass()));