2016-07-19 52 views
5

我有一個構造函數需要4個參數:String, Object, Object, MyEnum當我單擊查找用法時,Intellij如何選擇構造函數?

public MyClass(String name, Object val1, Object val2, MyEnum cat) { 
// find in usage = 202 
    this.name = name; 
    this.val1 = val1; 
    this.val2 = val2; 
    this.cat = cat; 
} 

在95%的使用情況最後一個參數是null,所以我想創建另一個構造函數,只需要3個參數,並將最後一個爲空。

一些想法來到我的腦海裏,但最後我給一個嘗試以下解決方案:

  1. 更改最後一個參數從MyEnumInteger(編譯錯誤 - 無所謂):public MyClass(String name, Object val1, Object val2, Integer cat) - 還是202發現功能

  2. 添加新的構造與對象類型的最後一個參數:public MyClass(String name, Object val1, Object val2, Object cat)現在第一個構造(與Integer)具有196層的用途和第二個6.

這正是我想要的(我有6個非空最後一個元素的調用),但是這種行爲的原因是什麼? Intellij是否做了一些檢查,如果輸入類型是MyEnum它不能作爲Integer類型傳遞,但可以將null傳遞給兩者,那麼爲什麼在第一個構造函數的情況下有6個更少的結果呢?

當我從Object更改爲String(現在我有2個構造函數StringInteger),當我運行查找使用時,兩者都給我0。

謝謝你對這種行爲的解釋。

+1

你在問關於Java的[重載規則](https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.9)嗎?或者你是否試圖描述IDEA中的「查找用法」與Java實際上不匹配的某種方式? –

+0

我只想了解IDEA如何在發佈的場景中選擇查找用法的結果。 – ruhungry

回答

0

這不是一個真正的IntelliJ問題,而是一個java構造函數鏈接問題。

如果有一個高的機會貓空,你應該有以下兩個構造函數:

public MyClass(String name, Object val1, Object val2) { 
    this(name, val1, val2, null) 
} 

public MyClass(String name, Object val1, Object val2, MyEnum cat) { 
    this.name = name; 
    this.val1 = val1; 
    this.val2 = val2; 
    this.cat = cat; 
} 
1

如果你有兩個myMethod(Integer a)myMethod(Object a),以myMethod(null)通話將調用整數版本,因爲它是更具體。同樣,如果您只有myMethod(MyEnum a)myMethod(Object a),則MyEnum版本將在傳遞null參數時被調用。 (關於空重載,請參閱this answer,其中引用section 15.12.2.5 of the Java Language Specification。)根據它是Integer還是MyEnum,其行爲方式實際上沒有區別;兩者都比Object更具體,所以這就是被選中的重載。

當您要求IntelliJ IDEA查找方法的用法時,它使用自己的代碼索引及其有關Java如何處理重載解析以查找調用該方法的所有情況的知識。雖然這些規則可能有點複雜(查看Java語言規範中的所有細節也使我的眼睛受到了傷害),並且可以想象,有一些用例可能會導致IDEA錯誤,並且看到與Java編譯器和Java編譯器不同的方式運行時會在這種情況下看起來是正確的。這是一個方便的方式來玩它,理解和測試重載分辨率如何工作。

相關問題