public boolean equals(Object o) {
    if (o == null || !(o instanceof PhantomType)) return false;

    PhantomType _t = (PhantomType) o;

    if (!_is_known || !_t._is_known) return false;

    if (_is_void && _t._is_void) return true;
    if (_is_void || _t._is_void) return false;

    if (_is_int && _t._is_int) return true;
    if (_is_int || _t._is_int) return false;

    if (_is_long && _t._is_long) return true;
    if (_is_long || _t._is_long) return false;

    if (_is_float && _t._is_float) return true;
    if (_is_float || _t._is_float) return false;

    if (_is_double && _t._is_double) return true;
    if (_is_double || _t._is_double) return false;

    if (_is_string && _t._is_string) return true;
    if (_is_string || _t._is_string) return false;

    if (_is_container != _t._is_container) return false;
    if (_container_class != _t._container_class) return false;

    return _class.equals(_t._class);
  }