{"action":"created","issue":{"url":"https://api.github.com/repos/siom79/japicmp/issues/126","repository_url":"https://api.github.com/repos/siom79/japicmp","labels_url":"https://api.github.com/repos/siom79/japicmp/issues/126/labels{/name}","comments_url":"https://api.github.com/repos/siom79/japicmp/issues/126/comments","events_url":"https://api.github.com/repos/siom79/japicmp/issues/126/events","html_url":"https://github.com/siom79/japicmp/issues/126","id":140935719,"number":126,"title":"Ignore interface implementation removals of ignored interfaces","user":{"login":"rmetzger","id":89049,"avatar_url":"https://avatars.githubusercontent.com/u/89049?v=3","gravatar_id":"","url":"https://api.github.com/users/rmetzger","html_url":"https://github.com/rmetzger","followers_url":"https://api.github.com/users/rmetzger/followers","following_url":"https://api.github.com/users/rmetzger/following{/other_user}","gists_url":"https://api.github.com/users/rmetzger/gists{/gist_id}","starred_url":"https://api.github.com/users/rmetzger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmetzger/subscriptions","organizations_url":"https://api.github.com/users/rmetzger/orgs","repos_url":"https://api.github.com/users/rmetzger/repos","events_url":"https://api.github.com/users/rmetzger/events{/privacy}","received_events_url":"https://api.github.com/users/rmetzger/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":2,"created_at":"2016-03-15T10:45:44Z","updated_at":"2016-03-21T09:31:23Z","closed_at":null,"body":"Hi,\r\n\r\nI've opened a pull request for the Apache Flink project to use japicmp for ensuring interface stability.\r\nWe are using annotation-based inclusions / excludes.\r\n\r\nWe have an interface called `Key`, which is annotated with `@PublicEvolving`. `@PublicEvolving` means we exclude the class from the japicmp checks.\r\n\r\n```java\r\n@PublicEvolving\r\npublic interface Key<T> extends Value, Comparable<T>\r\n```\r\n\r\nIn a recent change, the `Key` interface was removed. Some public (japicmp: included) classes implement the interface:\r\n\r\n```java\r\n@Public\r\npublic class DoubleValue implements Key<DoubleValue>, ResettableValue<DoubleValue>, CopyableValue<DoubleValue> {\r\n```\r\n\r\nRemoving the `Key` from the `DoubleValue` class leads to a breaking API change, detected by japicmp.\r\nUnder normal conditions, this is the correct behavior, however, in our case, users are not advised to use the `Key` class because its not marked for public use.\r\nAlso, we didn't remove any methods in the `DoubleValue` class. The `Key` interface is only used as a marker.\r\n\r\nWhat is your opinion on the case?\r\nI think it makes sense that japicmp ignores excluded classes when evaluating class implementations / extensions.\r\n"},"comment":{"url":"https://api.github.com/repos/siom79/japicmp/issues/comments/199191581","html_url":"https://github.com/siom79/japicmp/issues/126#issuecomment-199191581","issue_url":"https://api.github.com/repos/siom79/japicmp/issues/126","id":199191581,"user":{"login":"rmetzger","id":89049,"avatar_url":"https://avatars.githubusercontent.com/u/89049?v=3","gravatar_id":"","url":"https://api.github.com/users/rmetzger","html_url":"https://github.com/rmetzger","followers_url":"https://api.github.com/users/rmetzger/followers","following_url":"https://api.github.com/users/rmetzger/following{/other_user}","gists_url":"https://api.github.com/users/rmetzger/gists{/gist_id}","starred_url":"https://api.github.com/users/rmetzger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmetzger/subscriptions","organizations_url":"https://api.github.com/users/rmetzger/orgs","repos_url":"https://api.github.com/users/rmetzger/repos","events_url":"https://api.github.com/users/rmetzger/events{/privacy}","received_events_url":"https://api.github.com/users/rmetzger/received_events","type":"User","site_admin":false},"created_at":"2016-03-21T09:31:23Z","updated_at":"2016-03-21T09:31:23Z","body":"I'm using `0.7.0`.\r\n\r\nThe class hierarchies were like this before the change:\r\n```\r\nDoubleValue\r\n  Key\r\n    Value\r\n    Comparable\r\n  ResettableValue\r\n    Value\r\n```\r\n\r\nAfter the change:\r\n```\r\nDoubleValue\r\n  Comparable\r\n  ResettableValue\r\n    Value\r\n```\r\n\r\nThe two methods required by the `Key` interface are both implemented in `Object`  (`hashCode()`, `equals(Object)`) as well, so `DoubleValue` has them anyways.\r\n\r\nI agree that a user could have casted `DoubleValue` to `Key`. However, `Key` is annotated with `@PublicEvolving`, which means its excluded from japicmp's checks. So users are not advised to rely on the class because its subject to change or removal.\r\n"}}