【问题标题】:non-static inner class name as a type parameter非静态内部类名作为类型参数
【发布时间】:2016-01-12 01:27:05
【问题描述】:

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

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

在某处

public Baz<Bar> obj;

如果 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;
        }
    }
}

在视图模板中

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

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

很遗憾,这不会被编译。

是否可以将 SignupForm 用作 Form 类的类型参数?

提前致谢。

【问题讨论】:

  • unfortunately this will not be compiled. 你尝试编译了吗?
  • 好吧,我太着急了,我对这种情况的“概括”是不正确的。这就是为什么它“掩盖”了真正的问题(问题的第二部分)。

标签: java generics playframework playframework-2.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<>();
  }
}

【讨论】:

  • 当我加载它失败的页面。这是日志显示的内容:sbt.PlayExceptions$CompilationException: Compilation error[type SignupForm is not a member of object controllers.SignupController]
  • 你的解释绝对没问题。代码在纯 java 中完美编译。但问题的第二部分仍然悬而未决。您建议的帖子是关于 Play 框架的 Scala 风格及其最新版本。但我使用的是 Java 的。无论如何,它让我有了一些想法,谢谢
猜你喜欢
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多