Anonymous-classes.xhtml 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:pls="http://www.w3.org/2005/01/pronunciation-lexicon" xmlns:ssml="http://www.w3.org/2001/10/synthesis" xmlns:svg="http://www.w3.org/2000/svg">
  3. <head>
  4. <title>Anonymous classes</title>
  5. <link rel="stylesheet" type="text/css" href="docbook-epub.css"/>
  6. <link rel="stylesheet" type="text/css" href="kawa.css"/>
  7. <script src="kawa-ebook.js" type="text/javascript"/>
  8. <meta name="generator" content="DocBook XSL-NS Stylesheets V1.79.1"/>
  9. <link rel="prev" href="Defining-new-classes.xhtml" title="Defining new classes"/>
  10. <link rel="next" href="Enumerations.xhtml" title="Enumeration types"/>
  11. </head>
  12. <body>
  13. <header/>
  14. <section class="sect1" title="Anonymous classes" epub:type="subchapter" id="Anonymous-classes">
  15. <div class="titlepage">
  16. <div>
  17. <div>
  18. <h2 class="title" style="clear: both">Anonymous classes</h2>
  19. </div>
  20. </div>
  21. </div>
  22. <p class="synopsis" kind="Syntax"><span class="kind">Syntax</span><span class="ignore">: </span><a id="idm139667871704240" class="indexterm"/> <code class="function">object</code> <em class="replaceable"><code><span class="bold"><strong>(</strong></span></code></em><em class="replaceable"><code>supers</code></em> <em class="replaceable"><code>...</code></em><em class="replaceable"><code><span class="bold"><strong>)</strong></span></code></em> <em class="replaceable"><code>field-or-method-decl</code></em> <em class="replaceable"><code>...</code></em></p>
  23. <div class="blockquote">
  24. <blockquote class="blockquote">
  25. <p>Returns a new instance of an anonymous (inner) class.
  26. The syntax is similar to <code class="literal">define-class</code>.
  27. </p>
  28. <div class="literallayout">
  29. <p><a id="idm139667871698016" class="indexterm"/><span id="meta-object-field-or-method-decl"/><em class="replaceable"><code>object-field-or-method-decl</code></em> <code class="literal">::=</code> <a class="link" href="Anonymous-classes.xhtml#meta-object-field-decl"><em class="replaceable"><code>object-field-decl</code></em></a> | <a class="link" href="Defining-new-classes.xhtml#meta-method-decl"><em class="replaceable"><code>method-decl</code></em></a><br/>
  30. <a id="idm139667871694352" class="indexterm"/><span id="meta-object-field-decl"/><em class="replaceable"><code>object-field-decl</code></em> <code class="literal">::=</code> <code class="literal"><span class="bold"><strong>(</strong></span></code><a class="link" href="Defining-new-classes.xhtml#meta-field-name"><em class="replaceable"><code>field-name</code></em></a> (<a class="link" href="Annotations.xhtml#meta-annotation"><em class="replaceable"><code>annotation</code></em></a> | <a class="link" href="Types.xhtml#meta-opt-type-specifier"><em class="replaceable"><code>opt-type-specifier</code></em></a> | <a class="link" href="Defining-new-classes.xhtml#meta-field-option"><em class="replaceable"><code>field-option</code></em></a>)*  [<a class="link" href="Anonymous-classes.xhtml#meta-object-init"><em class="replaceable"><code>object-init</code></em></a>] <code class="literal"><span class="bold"><strong>)</strong></span></code><br/>
  31. <a id="idm139667871686816" class="indexterm"/><span id="meta-object-init"/><em class="replaceable"><code>object-init</code></em> <code class="literal">::=</code> <a class="link" href="Primitive-expression-syntax.xhtml#meta-expression"><em class="replaceable"><code>expression</code></em></a><br/>
  32. </p>
  33. </div>
  34. <p>Returns a new instance of a unique (anonymous) class.
  35. The class inherits from the list of <em class="replaceable"><code>supers</code></em>, where at most one of the
  36. elements should be the base class being extended from, and the rest
  37. are interfaces.
  38. </p>
  39. <p>This is roughly equivalent to:
  40. </p>
  41. <pre class="screen">(begin
  42. (define-simple-class <em class="replaceable"><code>hname</code></em> (<em class="replaceable"><code>supers</code></em> ...) <em class="replaceable"><code>field-or-method-decl</code></em> ...)
  43. (make <em class="replaceable"><code>hname</code></em>))
  44. </pre>
  45. <p>A <em class="replaceable"><code>field-decl</code></em> is as for <code class="literal">define-class</code>, except
  46. that we also allow an abbreviated syntax.
  47. Each <em class="replaceable"><code>field-decl</code></em> declares a public instance field.
  48. If <em class="replaceable"><code>object-finit</code></em> is given, it is an expression whose value
  49. becomes the initial value of the field.
  50. The <em class="replaceable"><code>object-init</code></em> is evaluated at the same time as the <code class="literal">object</code>
  51. expression is evaluated,
  52. in a scope where all the <em class="replaceable"><code>field-name</code></em>s are visible.
  53. </p>
  54. <p>A <em class="replaceable"><code>method-decl</code></em> is as for <code class="literal">define-class</code>.
  55. </p>
  56. </blockquote>
  57. </div>
  58. <span id="SAM-conversion"/>
  59. <section class="sect2" title="Lambda as shorthand for anonymous class" epub:type="division" id="idm139667871675040">
  60. <div class="titlepage">
  61. <div>
  62. <div>
  63. <h3 class="title">Lambda as shorthand for anonymous class</h3>
  64. </div>
  65. </div>
  66. </div>
  67. <p>An anonymous class is commonly used in the Java platform where a
  68. function language would use a lambda expression.
  69. Examples are call-back handlers, events handlers, and <code class="literal">run</code> methods.
  70. In these cases Kawa lets you use a lambda expression as a short-hand
  71. for an anonymous class. For example:
  72. </p>
  73. <pre class="screen">(button:addActionListener
  74. (lambda (e) (do-something)))
  75. </pre>
  76. <p>is equivalent to:
  77. </p>
  78. <pre class="screen">(button:addActionListener
  79. (object (java.awt.event.ActionListener)
  80. ((actionPerformed (e ::java.awt.event.ActionEvent))::void
  81. (do-something))))
  82. </pre>
  83. <p>This is possible when the required type is an interface or
  84. abstract class with a Single (exactly one) Abstract Methods.
  85. Such a class is sometypes called a <em class="firstterm">SAM-type</em>, and the
  86. conversion from a lambda expression to an anonymous class
  87. is sometimes called <em class="firstterm">SAM-conversion</em>.
  88. </p>
  89. <p>Note that Kawa can also infer the parameter and return types
  90. of a method that overrides a method in a super-class.
  91. </p>
  92. </section>
  93. </section>
  94. <footer>
  95. <div class="navfooter">
  96. <ul>
  97. <li>
  98. <b class="toc">
  99. <a href="Anonymous-classes.xhtml#idm139667871675040">Lambda as shorthand for anonymous class</a>
  100. </b>
  101. </li>
  102. </ul>
  103. <p>
  104. Up: <a accesskey="u" href="Objects-Classes-and-Modules.xhtml">Object, Classes and Modules</a></p>
  105. <p>
  106. Previous: <a accesskey="p" href="Defining-new-classes.xhtml">Defining new classes</a></p>
  107. <p>
  108. Next: <a accesskey="n" href="Enumerations.xhtml">Enumeration types</a></p>
  109. </div>
  110. </footer>
  111. </body>
  112. </html>