[英]Error Unchecked call to 'put(K, V)' as a member of raw type 'java.util.HashMap'
[英]JSONObject unchecked call to put(K,V) as a member of the raw type java.util.HashMap
下面的代碼產生以下編譯器警告:
JSONObject obj = new JSONObject();
obj.put("foo", "bar");
編譯器消息:
對未經審核的put(K,V)作為原始類型java.util.HashMap的成員的調用
我通過JSONObject.put()用值填充JSONObject,然后調用obj.toString()來獲取JSON。 我該如何解決以上警告(我使用-Werror進行編譯)。
JSONObject來自以下庫。
import org.json.simple.JSONObject;
Maven的依賴:
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
json-simple庫使用舊的字節碼版本:46.0編譯。 這是Java 1.2。 JSONObject映射擴展了java.util.HashMap,您可以直接使用java.util.HashMap的“ put”方法
Java 5中添加了泛型。從Java 5開始,編譯器鼓勵使用泛型類型。 編譯器建議通過這種方式,您應該升級代碼以使其更安全。
在這種情況下,不安全的用法來自庫,您無法對其進行控制。 我建議搜索該庫的較新版本或切換到另一個庫。
更新:您可以嘗試使用以下庫作為替代:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180813</version>
</dependency>
用法:
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.Arrays;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
JSONObject obj = new JSONObject();
obj.put("hello", "world");
obj.put("collection", new JSONArray(Arrays.asList(1, "two", Collections.singletonMap("three", 30))));
System.out.println("obj.toString() = " + obj.toString());
}
}
您收到此警告是因為org.json.simple.JSONObject
內部使用原始類型集合。
公共類JSONObject擴展了HashMap ...
如果要擺脫此警告,可以在代碼中添加以下注釋。
@SuppressWarnings("unchecked")
甚至更好的是,您可以嘗試使用支持泛型的庫...
您可以通過將其顯式強制轉換為所需的類型來消除該警告
((Map<String, String>)obj).put("foo", "bar")
但您有時會遇到另一個警告。
Type safety: Unchecked cast from JSONObject to Map<String,String>
這是因為JSONObject類是從HashMap擴展而來的,但沒有指定與Hashmap相同的泛型。
盡管我不會將其稱為最佳解決方案,但是如果您確實想在沒有任何警告的情況下使用相同的庫,則可以使用
Map<String,String> jsonMap = new HashMap<>();
jsonMap.put("foo", "bar");
JSONObject obj = new JSONObject(jsonMap);
這將在沒有任何警告的情況下工作,並且可以滿足您的需求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.