[英]Implementing Comparable, compareTo name clash: “have the same erasure, yet neither overrides the other”
[英]Java name clash, have the same erasure, neither hides the other
我收到此名稱沖突錯誤,並且我不知道該如何解決該問題。 我有兩個類,並且我正在使用重載方法“ createSensors”。 為了簡化,這里是產生問題的代碼:
public abstract class ClassA {
public static List<Sensor> createSensors(Collection<? extends ClassA> list) {
List<Sensor> sensors = new ArrayList<Sensor>();
for (ClassA s : list) {
sensors.add(s.getSensor());
}
return sensors;
}
}
public abstract class ClassB extends ClassA {
public static List<Sensor> createSensors(Collection<? extends ClassB> list) {
List<Sensor> sensors = new ArrayList<Sensor>();
for (ClassB s : list) {
sensors.add(s.getSensor());
}
return sensors;
}
}
除了此處實現相同的問題外,問題的核心是有些野蠻,“方法A和方法B具有相同的擦除”。
使這個問題變得復雜的是,我們通常對“類型擦除”一無所知(至少今天早上我沒有)。
簡而言之:
參數類型在編譯時執行類型檢查(以確保類型正確性),但在運行時忘記其類型參數(以避免生成基礎方法)。
這聽起來同時簡單而令人費解。 最好的理解方法是參考以下文獻:
希望能對您有所幫助。
就你而言
public abstract class ClassA {
public static List<Sensor> createSensors(Collection<? extends ClassA> list) {
//do stuff
}
}
public abstract class ClassB extends ClassA {
public static List<Sensor> createSensors(Collection<? extends ClassB> list) {
//do other stuff
}
}
將由javac“轉換”為
public abstract class ClassA {
public static List createSensors(Collection list) {
//do stuff
}
}
public abstract class ClassB extends ClassA {
public static List createSensors(Collection list) {
//do other stuff
}
}
其中一個顯然不能覆蓋另一個(不是相同的類型參數),但最終在運行時完全相同(程序無法選擇要使用哪個參數)。
這個問題夠了,怎么解決呢? 您可以采用以下方法之一:
使用不同的名稱: createASensors
和createBSensors
這種方法最明顯,但看起來不太優雅。
添加一個參數: createSensors(Collection<? extends ClassA> list, ClassA typeDefiner)
這種方法看起來很野蠻,但不太優雅,但是是java.util.List
用於方法<T> T[] toArray(T[] a)
。
通用解決方案是使用不同的名稱。 這些方法可以在沒有繼承關系的類中,因為它們不是實例方法。
如所指出的,問題中的方法實現是相同的(典型值除外)。
(此重載問題經常與擦除運行時類型混淆。重載是鏈接時間而不是動態問題,因此可以在語言中輕松解決。這不是特別有用的更改,也不是鼓勵使用的好主意。超載。)
檢查項目設置和項目的編譯器版本。 右鍵單擊項目->屬性-> Java編譯器。 確保符合性設置是最新的。 將法規遵從性設置設置為1.4而不是1.6時出現了這個問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.