Kotlin - не может получить доступ к элементам [L java .lang.Object - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть некоторые проблемы с библиотекой java в Kotlin.

Я не могу найти способ доступа к элементам [L java .lang.Object I ' я пытаюсь привести его в массив или список; не могу найти никакой документации об этом.

Если кто-нибудь может дать мне голову. заранее спасибо

РЕДАКТИРОВАТЬ: некоторый код. Это класс java, который я реализую в kotlin, это API-интерфейс для подключения к Odoo, поэтому есть и другие библиотеки, включающие xmlrp c и другие классы API. Я постараюсь сделать это простым

public class Response {

private final boolean isSuccessful;
private final Exception errorCause;
private final Object responseObject;
private final Object[] responseObjectAsArray;

public Response(final Exception errorCause) {
    this.isSuccessful = false;
    this.errorCause = errorCause;
    this.responseObject = null;
    this.responseObjectAsArray = new Object[0];
}

public Response(final Object responseObject) {
    this.isSuccessful = true;
    this.errorCause = null;
    this.responseObject = responseObject;
    if (responseObject instanceof Object[]) {
        this.responseObjectAsArray = (Object[]) responseObject;
    } else {
        this.responseObjectAsArray = new Object[]{responseObject};
    }
}

public boolean isSuccessful() {
    return isSuccessful;
}

public Throwable getErrorCause() {
    return errorCause;
}

public Object getResponseObject() {
    return responseObject;
}

public Object[] getResponseObjectAsArray() {
    return responseObjectAsArray;
}
}

, вот функция из библиотеки

 public RowCollection searchAndReadObject(final FilterCollection filter, final String[] fields, int offset, int limit, String order) throws XmlRpcException, OdooApiException {

   String[] fieldArray = fields == null ? new String[]{} : fields;
   Object[] preparedFilters = validateFilters(filter);

   Response response = command.searchAndReadObject(modelName, preparedFilters,fieldArray,offset,limit,order);

   FieldCollection fieldCol = new FieldCollection();
   for (String fieldName : fieldArray) {
       for (Field fld : allFields) {
           if (fld.getName().equals(fieldName)) {
               fieldCol.add(fld);
           }
       }
   }

   return new RowCollection(response.getResponseObjectAsArray(), fieldCol);

   }

public RowCollection(Object [] openERPResultSet, FieldCollection fields) throws OdooApiException{
    for (int i = 0; i < openERPResultSet.length; i++){
        //aca tengo que chequear el objecto
        Row row = new Row((HashMap<String, Object>) openERPResultSet[i], fields);
        this.add(row);
    }
}

и строка из набора строк

public Row (HashMap<String, Object> openERPResult, FieldCollection fields) throws OdooApiException{
    this.openERPResult = openERPResult;
    this.fields = fields;
    // This is a new row, add entries for every field
    if (openERPResult.isEmpty()){
        this.put("id", 0);
        for (int i = 0; i < fields.size(); i++)
            this.put(fields.get(i).getName(),null);
    }

}

Из команды searchAndReadObject

public Response searchAndReadObject(String objectName, Object[] filter, String[] fields, int offset, int limit, String order) throws XmlRpcException {
    Response readResult;
    Object offsetParam = offset < 0 ? false : offset;
    Object limitParam = limit < 0 ? false : limit;
    Object orderParam = order == null || order.length() == 0 ? false : order;
    if (this.session.getServerVersion().getMajor() >= 8) {
        readResult = new Response(session.executeCommandWithContext(objectName, "search_read", new Object[]{filter, fields,offsetParam,limitParam,orderParam}));
    } else {
        //TODO: Have to be rewritten/deleted considering the previous call
        readResult = new Response(session.executeCommand(objectName, "search_read", new Object[]{filter, fields, session.getContext(),offsetParam,limitParam,orderParam}));
    }

    return readResult;
}

А это код в Kotlin, это простой доступ к записи:

object Constant{
 const val URL :String= "localhost" //where im running Odoo 8
 const val PORT: Int=8069
 const val DB = "DataBase"


 }
 val sesion=Session(Constant.URL,Constant.PORT,Constant.DB,"admin","admin")
 sesion.startSession()
 val filter= FilterCollection()
 filter.add("user_id","=",sesion!!.userID)
 val clientAd=sesion!!.getObjectAdapter("res.partner")

 val clients=clientAd.searchAndReadObject(filter, arrayOf("name", "city_id", "internal_code", "phone"),1,1,"id ASC")

проблема в том, когда я пытаюсь получить доступ к столбцу city_id

[
{
    "internal_code": "1234",
    "city_id": [ 21, "city name" ],
    "id": 7,
    "name": "Agrolait"
}]

клиентов [0] ["city_id"] является объектом []. Мне нужно получить доступ к элементам

clients[0]["city_id"]
res14: kotlin.Any! = [Ljava.lang.Object;@38f1f6c9

Я надеюсь, что это может прояснить мой вопрос

1 Ответ

0 голосов
/ 30 апреля 2020

Хорошо ... Я изменил библиотеку java, приведя Объект [] к списку внутри библиотеки. Затем в Kotlin я могу преобразовать java .util.ArrayList в ArrayList из kotlin. Я думал, что приведение будет автоматическим c, но я должен сделать это неявно.

Это обходной путь, чтобы заставить его работать, но все еще не могу привести объект [] к массиву. Надеюсь, что это может быть полезным для кого-то

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...