簡體   English   中英

Java名稱沖突,具有相同的擦除方式,但兩者都不隱藏

[英]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具有相同的擦除”。

使這個問題變得復雜的是,我們通常對“類型擦除”一無所知(至少今天早上我沒有)。

簡而言之:

參數類型在編譯時執行類型檢查(以確保類型正確性),但在運行時忘記其類型參數(以避免生成基礎方法)。

這聽起來同時簡單而令人費解。 最好的理解方法是參考以下文獻:

  1. 什么是可更改類型?
  2. 如何以及在什么條件下執行擦除?
  3. 您是否對我的編碼生活有任何想法/示例?
  4. 好吧,這很奇怪,我不是很喜歡,但是我很好奇他們為什么要這么做...

希望能對您有所幫助。

具體答案:

就你而言

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
   }
}

其中一個顯然不能覆蓋另一個(不是相同的類型參數),但最終在運行時完全相同(程序無法選擇要使用哪個參數)。

這個問題夠了,怎么解決呢? 您可以采用以下方法之一:

  • 使用不同的名稱: createASensorscreateBSensors這種方法最明顯,但看起來不太優雅。

  • 添加一個參數: 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.

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