[英]Error initializating a generic version of Java singleton on the fly (single line)
場景:確實,我正在翻譯自己的Objective-C
庫,以使用Java
實現與Android
開發相同的功能,即Singleton
包含Hashtable<String, V>
(NSMutableDictionary in Objective-C)
以方便程序員進行inject
和pop
基於key-value coding
。 代碼如下...
Singleton.java
import java.util.Hashtable;
public class Singleton<V> {
private static volatile Singleton sharedInstance = null;
private Hashtable<String, V> sharedHashtable;
private Singleton() {
sharedHashtable = new Hashtable<String, V>();
}
public static Singleton getSharedInstance() {
if (sharedInstance == null) {
sharedInstance = new Singleton();
}
return sharedInstance;
}
public void inject(String key, V value) {
sharedHashtable.put(key, value);
}
public V popValue(String key) {
return sharedHashtable.get(key);
}
}
Main.java
public class Main {
public static void main(String[] args) {
// Part 1
Singleton<String> stringVersion = Singleton.getSharedInstance();
stringVersion.inject("RAMStringKey", "Hello I am Using SO");
String string = stringVersion.popValue("RAMStringKey");
// Part 2
Singleton<Integer> integerVersion = Singleton.getSharedInstance();
integerVersion.inject("RAMIntegerKey", 5);
Integer integer = integerVersion.popValue("RAMIntegerKey");
System.out.println(string);
System.out.println(integer);
// Part 3
String anotherString = Singleton.getSharedInstance().popValue("RAMStringKey"); // Error:(27, 70) java: incompatible types: java.lang.Object cannot be converted to java.lang.String
}
}
問題:我已經成功實現了強類型化,因此可以注入任何對象(字符串或整數)並彈出任何對象。 但是在第3部分中,我試圖動態地(單行)執行相同操作,但它給出了錯誤
Error:(27, 70) java: incompatible types: java.lang.Object cannot be converted to java.lang.String
我真的在嘗試做類似的事情:
String anotherString = Singleton<String>.getSharedInstance().popValue("RAMKey");
但這是不允許的。
如何像第3部分中一樣在單行中創建一個單例? 誰能幫助我實現這一目標? 我應該在哪里進行更改?
提示:第3部分是第1部分的單行版本
type參數在編譯時用於類型檢查。 Singleton
類不知道類型參數,實例可能知道類型參數。 對Singleton.getSharedInstance()
的首次調用在第1部分中創建了HashMap<String,Object>
。在此映射中存儲String
或Integer
值是合法的。 在第3部分中, getSharedInstance()
訪問映射HashMap<String,Object>
,因此popValue()
返回一個Object
,該Object
不能如錯誤所述那樣轉換為String
。
請注意,只有一個靜態實例sharedInstance
,而不是每個使用的type參數一個!
而且,由於您提到了Android:請注意android中的單例:如果應用程序已退出並重新啟動,則無法保證已為您的應用程序重新啟動了VM。 這意味着來自先前運行的單例實例可能會生存,並且其狀態可能對新運行有用或可能不有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.