簡體   English   中英

為什么我的名單 <Long> 包含整數?

[英]Why does my List<Long> contain integers?

所以,我有以下方法在本地假冒數據庫:

public class TestClassDao implements ClassDao {

    // ...

    private static List<ClassDto> classes = new ArrayList<>();

    @Override
    public List<ClassDto> getClassesByIds(List<Long> classIds) {
        List<ClassDto> results = new ArrayList<>();

        for (ClassDto classInstance : classes) {
            if (classIds.contains(classInstance.getId())) {
                results.add(classInstance);
            }
        }

        return cloner.deepClone(results);
   }

   //...

}

我很困惑,因為結果總是空洞的。 我在Android Studio中逐步調試了調試器,發現即使知道存在正確的ID,包含檢查也始終返回false

跟蹤早與調試,我發現了什么我懷疑是罪魁禍首:根據調試器, List<Long> classIds包含*整數*的對象。 是什么賦予了? 我不確定如何進一步調試。

編輯:

這是問題所基於的調試器輸出: 在此輸入圖像描述

編輯2:

以下是測試數據如何加載到數據存儲中,您可以看到我正確傳遞Long值:

下面的方法由一個方法調用,該方法對學校做類似的事情,然后通過測試DAO中的方法持久化。

public static ClassDto getClassTestData(int classId) {
    ClassDto classDto = new ClassDto();

    switch (classId) {
        case 1:
            classDto.setId(1L);
            classDto.setName("207E - Mrs. Randolph");
            classDto.setTeacher(getTeacherTestData());
            classDto.setStudents(getStudentsTestData());
            return classDto;
        case 2:
            classDto.setId(2L);
            classDto.setName("209W - Mr. Burns");
            classDto.setTeacher(getTeacherTestData());
            return classDto;
        case 3:
            classDto.setId(3L);
            classDto.setName("249E - Mr. Sorola");
            classDto.setTeacher(getTeacherTestData());
            return classDto;
        default:
            return null;
    }
}

編輯3:

以下是持久保存/檢索學校信息的DAO。 問題出現在插入數據的時間和刪除數據之間。 它與Long類型一起出現,並與Int類型一起出現

@Dao
public interface SchoolDao {

    @Query("SELECT * FROM schools")
   List<SchoolDto> getAllSchools();

    @Insert
    void insertSchool(SchoolDto schoolDto);

    }

哇,真是個噩夢。 我找到了罪魁禍首。

我創建了一個TypeConverter來將List<Integer>轉換為字符串(並返回),以便它可以存儲在房間DB中的單個列中,而無需修改現有的DTO。 但是,當我切換到使用Long類型作為ID時,我無法在轉換器中轉換下面的單個泛型參數; 仔細看下面的代碼:

public class IdsListConverter {

    @TypeConverter
    public List<Long> idsFromString(String value) {
        Gson gson = new Gson();
        if (value == null || value.isEmpty()) {
            return null;
        } else {
            Type resultType = new TypeToken<List<Integer>>(){}.getType();
            return gson.fromJson(value, resultType);
        }
    }

    @TypeConverter
    public String idsToString(List<Long> ids) {
        if (ids == null) {
            return null;
        } else {
            Gson gson = new Gson();
            return gson.toJson(ids);
        }
    }

}

看起來你發現了你的問題:

Type resultType = new TypeToken<List<Integer>>(){}.getType();
return gson.fromJson(value, resultType);

(在返回List<Long>的方法中),它應該是:

Type resultType = new TypeToken<List<Long>>(){}.getType();

有一種類型安全的方法可以編寫這個,它可以在編譯時解決問題:

TypeToke<List<Integer>> resultTypeToken = new TypeToken<List<Integer>>() {};
return gson.getAdapter(resultTypeToken).fromJson(value);

這不會編譯,因為return語句的類型與方法的返回類型不兼容。

可能值得尋找fromJson其他事件,以便您可以遷移它們並查看是否還有其他問題尚未找到!

你看錯了變量。 ClassDao實例在下面,你可以看到“{Long @ 6495}”1“。但你傳播的整數”1“是你的代碼中省略的ClassIds的元素。你確定ClassIds是List(),當添加元素時,你應該做classIds.add(new Long(1))。

為了將來參考,此鑄造規則列表將為您提供幫助。 從本質上講,我認為存在隱含的鑄造沖突。

byte –> short –> int –> long –> float –> double

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM