2016-01-11 54 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