2011-01-26 44 views
5

所以我在做一些jUnit測試,並且想要編寫具有類似功能但是足夠小以便在單個類中寫入的不同類。無論設計決定如何,我都會遇到編譯器錯誤,我不確定我看到的規則是什麼。靜態內部類需要導入用於註釋

你能想象它會看起來像

package foo; 

@RunWith(Suite.class) 
@SuiteClasses({ TestClassOne.class, TestClassTwo.class }) 
public class TestSuite{ 

    @RunWith(SpringJUnit4ClassRunner.class) 
    public static class TestClassOne{ 

    } 

    @RunWith(SpringJUnit4ClassRunner.class) 
    public static class TestClassTwo{ 

    } 
} 

現在,當編譯器踢它,它會說TestClassOne不能被解析爲一個類型。有一個簡單的方法來解決這個問題。例如,它需要顯式導入靜態類。

import foo.TestSuite.TestClassOne; 
import foo.TestSuite.TestClassTwo; 

我的問題是,任何人都可以解釋一下編譯器的規則或原因可能存在的註解無法看到類的靜態內部類。請記住,包私人課程看起來很好,並且無需導入即可編譯。

回答

5

這是一個有趣的。根據[1],名稱「TestClassOne」的範圍是類」TestSuite「的全部範圍。

的「注意」 TestSuite?顯然不是。但這不太公平。範圍規則是在引入註釋之前定義的。如果在課堂範圍內考慮課堂註釋,我不會看到任何問題。無論如何,他們都非常親密。

另一個問題是如何在註釋中引用簡單名稱「TestSuite」?原來這個規範涵蓋了這個。註釋是一個修飾符,它是類型聲明的一部分,「頂級類型的範圍在包中全部爲類型聲明」。

然而,這個規範有可能是偶然發現的。這些規則是在引入註釋之前定義的,之後保持不變。因此,雖然它涵蓋技術性的案例,但可能是一個意外。這不是懷疑語言設計師的腦力 - 整個規範太複雜了。

[1] http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.3

5

你並不需要導入內部類,你可以使用

TestSuite.TestClassOne 

細節訪問它們可以在JLS找到,但我的簡單規則是:一個進口a.b.c.d.e允許你使用e代替的完全限定名稱。它不允許你使用f

+0

夠公平的,我可以引用它的類然後它的子類。我的反對更多的是因爲你可以在類中引用它的子靜態類而不用它自己的類名進行限定。我正在尋找你需要我看到的限定符 – 2011-01-26 14:30:20

+0

的原因。在這個類中,就像你從類中導入了所有東西,包括內部類。 – maaartinus 2011-01-26 14:32:28

2

只是一個額外的信息:有必要使用註釋的時候,還用它作爲參數類型,這是非常惱人的當導入內部類不但。