非静态内部类名作为类型参数

时间:2016-01-11 17:18:51

标签: java generics playframework playframework-2.0

有没有办法使用非静态内部类名作为类型参数? 类似的东西:

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

和某处

public Baz<Bar> obj;

如果Bar Bar是静态的,我可以写

public Baz<Foo.Bar> obj;

但在这种情况下,Foo中的非静态变量不能在Bar中使用。问题是我需要在Bar中使用Foo的非静态成员。

基于Java Play框架的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;
        }
    }
}

在veiw模板中

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

必须在内部类SignupForm中看到userService,并且不能是静态的。这就是为什么SignupForm也不能是静态的。

遗憾的是,这不会被编译。

是否可以使用SignupForm作为类Form?

的类型参数

提前感谢。

1 个答案:

答案 0 :(得分: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<>();
  }
}