簡體   English   中英

動態初始化Java單例的通用版本時出錯(單行)

[英]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)以方便程序員進行injectpop基於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> 。在此映射中存儲StringInteger值是合法的。 在第3部分中, getSharedInstance()訪問映射HashMap<String,Object> ,因此popValue()返回一個Object ,該Object不能如錯誤所述那樣轉換為String

請注意,只有一個靜態實例sharedInstance ,而不是每個使用的type參數一個!

而且,由於您提到了Android:請注意android中的單例:如果應用程序已退出並重新啟動,則無法保證已為您的應用程序重新啟動了VM。 這意味着來自先前運行的單例實例可能會生存,並且其狀態可能對新運行有用或可能不有用。

暫無
暫無

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

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