Why are JUnit assert methods not generic in Java?

后端 未结 2 531
野趣味
野趣味 2021-01-18 16:34

I am using JUnit 4.12. The assert methods are not generic in nature. For instance, assertEquals method looks like:

static public void assertEquals(Object ex         


        
2条回答
  •  终归单人心
    2021-01-18 17:03

    Having a generic method like this:

     void assertEquals(T expected, T actual) { /* ... */ }
    

    gives you no type safety to avoid comparing unlike types: you can pass in anything to this method, since T degenerates to its upper bound, Object:

    assertEquals("string", 0);  // Compiles fine, even though they can't be equal.
    

    Ideone demo

    And nor can you use any methods on expected and actual that aren't found on Object. So, T is basically just Object.

    As such, adding generics is just over-complicating the implementation.


    Now, you could define a class like this:

    class GenericAssert {
      void assertEquals(T expected, T actual) { /* ... */ }
    }
    

    and you could use this like:

    new GenericAssert().assertEquals("string", 0);  // Compiler error.
    

    because you've now placed a tighter upper bound on the acceptable parameters of assertEquals, at class level.

    But this just feels a bit awkward.

提交回复
热议问题