fork(1) download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. /* Name of the class has to be "Main" only if the class is public. */
  8. class Ideone
  9. {
  10. public static void main (String[] args) throws java.lang.Exception
  11. {
  12. // your code goes here
  13. new Ideone();
  14. }
  15.  
  16. Ideone() {
  17. Foo<Bar> fooBar = new Foo<>(Bar.class);
  18. Foo<Bar2> fooBar2 = new Foo<>(Bar2.class);
  19. fooBar.say("fooBar", Bar.class);
  20. fooBar2.say("fooBar2", Bar2.class);
  21.  
  22. Foo<Bar2> shouldFail = fooBar.fooing(Bar.class); // this should not work at compile time
  23. Foo<? extends Bar2> shouldFail2 = fooBar.fooing(Bar.class); // this should not work at compile time
  24. shouldFail.say("shouldFail", null);
  25. shouldFail2.say("shouldFail2", null);
  26.  
  27. // wanted:
  28. Foo<Bar> barFoo = fooBar2.fooing(Bar.class);
  29. Foo<? super Bar> barFoo2 = fooBar2.fooing(Bar.class);
  30. barFoo.say("barFoo", Bar.class);
  31. barFoo2.say("barFoo2", Bar.class);
  32. }
  33.  
  34. class Foo<T extends Bar> {
  35. Class<T> myClass;
  36.  
  37. public Foo(Class<T> clazz) {
  38. myClass = clazz;
  39. }
  40.  
  41. public <S extends Bar> Foo<S> fooing(Class<? super T> clazz) {
  42. return new Foo(clazz);
  43. }
  44.  
  45. public void say(String pre, Class<?> expected) {
  46. if (!myClass.equals(expected)) {
  47. System.out.print("FAILURE!!! ");
  48. }
  49. System.out.println("" + pre + " was: " + myClass.getSimpleName() +
  50. "(expected: " + expected + ")");
  51. }
  52. }
  53.  
  54. class Bar {
  55. }
  56.  
  57. class Bar2 extends Bar {
  58. }
  59. }
Success #stdin #stdout 0.08s 380160KB
stdin
Standard input is empty
stdout
fooBar was: Bar(expected: class Ideone$Bar)
fooBar2 was: Bar2(expected: class Ideone$Bar2)
FAILURE!!! shouldFail was: Bar(expected: null)
FAILURE!!! shouldFail2 was: Bar(expected: null)
barFoo was: Bar(expected: class Ideone$Bar)
barFoo2 was: Bar(expected: class Ideone$Bar)