簡體   English   中英

如何防止類型刪除?

[英]How to prevent type erasure?

我有一個我想重構的方法,它看起來像這樣(非常簡化):

import com.sun.tools.javac.util.Pair;

private int foo(Pair<String, ?>... params) {
    if (params[0].snd instanceof String) {
        // do something
        return 0;
    } else if (params[0].snd instanceof ArrayList) {
        // do something else
        return 1;
    }
    return -1; // realistically in the code base, this line will never happen **edit: disregard this line
}

所以我想我會做一些事情,例如將其分為兩種方法,這樣我就不必進行類型檢查了。 (這是否是一個很好的重構?)

所以我想做這樣的事情:

private int foo(Pair<String, String>... params) {
    // do something
    return 0;
}

private int foo(Pair<String, ArrayList>... params) {
    // do something else
    return 1;
}

但是編譯器一直告訴我,兩個foo()方法都具有相同的類型擦除。 Java是否只是擦除Pair<A, B>知道的一切? 如果是這樣,那么重構的最佳方法是什么? (或是否需要重構)

在編譯時,Java將擦除泛型的類型信息。 沒有辦法防止這種情況。 在運行時,Pair沒有<A,B>實際上是<Object,Object>

至於重構,您可能會喜歡一些事情(除了一個建議),您的示例中沒有太多可以改進的地方-我可能只用一個(如果最后一行不能發生。)我會使用列表而不是特定類型的列表。

private int foo(Pair<String, ?>... params) {
  if (params[0].snd instanceof String) {
    return 0;
  } else { //if(params[0].snd instanceof List) { //is a List interface, not which List
    // do something else
    return 1;
  }
// return -1; // If it can't happen, why have it here.
}

我會補充一點

private int foo(Pair<String, String>... params) {
    return 0;
}

private int foo(Pair<String, ArrayList>... params) {
    return 1;
}

如果允許使用此代碼,則不會有太大用處。 您知道要傳遞給foo的類型。 不管引用的類型是什么,而不是實際對象的類型。 因此,只需將所有傳遞給Pair<String, String> 0替換為對此的所有調用。

也就是說,應在編譯時確定調用哪個方法。 不在運行時。 而且,如果它在編譯時是可確定的,則根本不需要調用該方法。

暫無
暫無

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

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