1 /* |
1 /* |
2 * @test /nodynamiccopyright/ |
2 * @test /nodynamiccopyright/ |
3 * @bug 8006733 8006775 |
3 * @bug 8006733 8006775 |
4 |
4 * @summary Ensure behavior for nested types is correct. |
5 * @summary A static outer class cannot be annotated. |
|
6 * @author Werner Dietl |
5 * @author Werner Dietl |
7 * @compile/fail/ref=CantAnnotateStaticClass.out -XDrawDiagnostics CantAnnotateStaticClass.java |
6 * @compile CantAnnotateStaticClass.java |
8 */ |
7 */ |
9 |
8 |
10 import java.util.List; |
9 import java.util.List; |
|
10 import java.util.ArrayList; |
|
11 import java.util.HashMap; |
11 import java.lang.annotation.*; |
12 import java.lang.annotation.*; |
12 |
13 |
13 class CantAnnotateStaticClass { |
14 class Top { |
14 @Target(ElementType.TYPE_USE) |
15 @Target(ElementType.TYPE_USE) |
15 @interface A {} |
16 @interface TA {} |
16 |
17 |
17 static class Outer { |
18 @Target(ElementType.TYPE_USE) |
18 class Inner {} |
19 @interface TB {} |
|
20 |
|
21 @Target(ElementType.TYPE_USE) |
|
22 @interface TC {} |
|
23 |
|
24 class Outer { |
|
25 class Inner { |
|
26 Object o1 = Top.this; |
|
27 Object o2 = Outer.this; |
|
28 Object o3 = this; |
|
29 } |
|
30 // Illegal |
|
31 // static class SInner {} |
|
32 // interface IInner {} |
19 } |
33 } |
20 |
34 |
21 // 8 errors: |
35 // All combinations are OK |
22 @A Outer.Inner f1; |
36 |
23 @A Outer.Inner f1r() { return null; } |
37 Top.@TB Outer f1; |
24 void f1p(@A Outer.Inner p) { } |
38 @TB Outer.Inner f1a; |
25 void f1c(Object o) { |
39 Outer. @TC Inner f1b; |
26 Object l = (@A Outer.Inner) o; |
40 @TB Outer. @TC Inner f1c; |
|
41 |
|
42 @TA Top. @TB Outer f2; |
|
43 @TA Top. @TB Outer.Inner f2a; |
|
44 @TA Top. Outer. @TC Inner f2b; |
|
45 @TA Top. @TB Outer. @TC Inner f2c; |
|
46 |
|
47 @TB Outer f1r() { return null; } |
|
48 @TB Outer.Inner f1ra() { return null; } |
|
49 Outer. @TC Inner f1rb() { return null; } |
|
50 @TB Outer. @TC Inner f1rc() { return null; } |
|
51 |
|
52 void f1param(@TB Outer p, |
|
53 @TB Outer.Inner p1, |
|
54 Outer. @TC Inner p2, |
|
55 @TB Outer. @TC Inner p3) { } |
|
56 |
|
57 void f1cast(Object o) { |
|
58 Object l; |
|
59 l = (@TB Outer) o; |
|
60 l = (@TB Outer.Inner) o; |
|
61 l = (Outer. @TC Inner) o; |
|
62 l = (@TB Outer. @TC Inner) o; |
27 } |
63 } |
28 |
64 |
29 List<@A Outer.Inner> f2; |
65 List<@TB Outer> g1; |
30 List<@A Outer.Inner> f2r() { return null; } |
66 List<@TB Outer.Inner> g1a; |
31 void f2p(List<@A Outer.Inner> p) { } |
67 List<Outer. @TC Inner> g1b; |
32 void f2c(Object o) { |
68 List<@TB Outer. @TC Inner> g1c; |
33 Object l = (List<@A Outer.Inner>) o; |
69 |
|
70 List<@TA Top. @TB Outer> g2; |
|
71 List<@TA Top. @TB Outer.Inner> g2a; |
|
72 List<@TA Top. Outer. @TC Inner> g2b; |
|
73 List<@TA Top. @TB Outer. @TC Inner> g2c; |
|
74 |
|
75 List<@TB Outer> g1r() { return null; } |
|
76 List<@TB Outer.Inner> g1ra() { return null; } |
|
77 List<Outer. @TC Inner> g1rb() { return null; } |
|
78 List<@TB Outer. @TC Inner> g1rc() { return null; } |
|
79 |
|
80 void g1param(List<@TB Outer> p, |
|
81 List<@TB Outer.Inner> p1, |
|
82 List<Outer. @TC Inner> p2, |
|
83 List<@TB Outer. @TC Inner> p3) { } |
|
84 |
|
85 void g1new(Object o) { |
|
86 Object l; |
|
87 l = new @TB ArrayList<@TB Outer>(); |
|
88 l = new @TB ArrayList<@TB Outer.Inner>(); |
|
89 l = new @TB HashMap<String, Outer. @TC Inner>(); |
|
90 l = new @TB HashMap<String, @TB Outer. Inner>(); |
|
91 l = new @TB HashMap<String, @TB Outer. @TC Inner>(); |
|
92 l = new @TB HashMap<String, @TA Top. Outer. @TC Inner>(); |
|
93 l = new @TB HashMap<String, @TA Top. @TB Outer. Inner>(); |
|
94 l = new @TB HashMap<String, @TA Top. @TB Outer. @TC Inner>(); |
34 } |
95 } |
35 |
|
36 // OK: |
|
37 @A Outer g1; |
|
38 List<@A Outer> g2; |
|
39 Outer. @A Inner g3; |
|
40 List<Outer. @A Inner> g4; |
|
41 } |
96 } |