2016-01-11 92 views
0

是否有一種使用非靜態內部類名稱作爲類型參數的方法? 類似的東西:作爲類型參數的非靜態內部類名稱

public class Foo { 
    ... 
    // non-static inner class 
    public class Bar { 
    ... 
    } 
} 

和地方

public Baz<Bar> obj; 

如果類酒吧一直靜我可以寫

public Baz<Foo.Bar> obj; 

但在這種情況下,富非靜態變量不能用於酒吧。問題是我需要在Bar中使用Foo的非靜態成員。

在Java遊戲框架,基於Web的應用程序的真實情況:

public class SignupController extends Controller { 

    @Inject 
    private UserService userService; 
    ... 
    public class SignupForm { 

     public String validate() { 
      if (userService.findUserByEmail(email) != null) { 
       return Messages.get("error.email.is.in.use"); 
      } 
      return null; 
     } 
    } 
} 

在教職員模板

@(signupForm: Form[controllers.SignupController.SignupForm]) 
... 

userService必須在內部類SignupForm可以看出,不能是靜態的。這就是爲什麼SignupForm不能是靜態的原因。

不幸的是,這不會被編譯。

是否有可能使用SignupForm作爲類Form的類型參數?

在此先感謝。

+0

'不幸的是這不會被編譯.'你是否嘗試編譯它。 – YoungHobbit

+0

好吧,我太急了,我的「泛化」的情況是不正確的。這就是爲什麼它「遮蔽」了真正的問題(問題的第二部分)。 – devkuzmin

回答

1
public Baz<Foo.Bar> obj; 

要像上面那樣訪問內部類,您不需要將其設置爲靜態。它是直接訪問和完美編譯。

爲什麼這個工程:Qualified Type Names

因爲您嘗試訪問是使用類型,這對java編譯器完全合法的一個類型。

這裏是一個示例代碼。編譯完美:

public class outer {  
    public class inner {  
    } 
} 

class another { 
    private List<outer.inner> list = new ArrayList<>();  
    public List<outer.inner> method() { 
    return new ArrayList<>(); 
    } 
} 
+0

當我加載頁面失敗。這是什麼日誌顯示:sbt.PlayExceptions $ CompilationException:編譯錯誤[類型SignupForm不是對象controllers.SignupController的成員] – devkuzmin

+0

試試這個職位:http://stackoverflow.com/questions/30543960/play-framework-for -scala-compilation-errortype-application-is-not-a-member-of- – YoungHobbit

+1

你的解釋絕對沒問題。代碼完全用普通的java編譯。 但問題的第二部分仍然是開放的。 您建議的帖子是關於Play框架的Scala風格以及它的最新版本。但我使用Java。無論如何,它給了我一些想法,謝謝 – devkuzmin