{"action":"created","issue":{"url":"https://api.github.com/repos/SpongePowered/SpongeAPI/issues/221","labels_url":"https://api.github.com/repos/SpongePowered/SpongeAPI/issues/221/labels{/name}","comments_url":"https://api.github.com/repos/SpongePowered/SpongeAPI/issues/221/comments","events_url":"https://api.github.com/repos/SpongePowered/SpongeAPI/issues/221/events","html_url":"https://github.com/SpongePowered/SpongeAPI/issues/221","id":49492211,"number":221,"title":"Ongoing Minor Issue List (OCD list)","user":{"login":"Phroa","id":6373176,"avatar_url":"https://avatars.githubusercontent.com/u/6373176?v=3","gravatar_id":"","url":"https://api.github.com/users/Phroa","html_url":"https://github.com/Phroa","followers_url":"https://api.github.com/users/Phroa/followers","following_url":"https://api.github.com/users/Phroa/following{/other_user}","gists_url":"https://api.github.com/users/Phroa/gists{/gist_id}","starred_url":"https://api.github.com/users/Phroa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Phroa/subscriptions","organizations_url":"https://api.github.com/users/Phroa/orgs","repos_url":"https://api.github.com/users/Phroa/repos","events_url":"https://api.github.com/users/Phroa/events{/privacy}","received_events_url":"https://api.github.com/users/Phroa/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/SpongePowered/SpongeAPI/labels/accepted","name":"accepted","color":"d4c5f9"},{"url":"https://api.github.com/repos/SpongePowered/SpongeAPI/labels/low%20priority","name":"low priority","color":"bfe5bf"}],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":42,"created_at":"2014-11-20T04:43:27Z","updated_at":"2015-05-31T10:54:49Z","closed_at":null,"body":"__Minor Issues List__\r\n\r\n- [ ] Discover Minor Issues\r\n- [ ] SpongeAPI should use quaternions for rotations (provided by flow-math) as they are superior to euler angles and the standard in games. Both options should be provided: what the implementation doesn't support becomes a simple overload (conversions representations are provided by flow-math).\r\n- [ ] Have checkstyle warn on missing Override annotation\r\n\r\n__Checkstyle warnings__\r\n\r\nFile | Problem\r\n---- | ----\r\n"},"comment":{"url":"https://api.github.com/repos/SpongePowered/SpongeAPI/issues/comments/107156044","html_url":"https://github.com/SpongePowered/SpongeAPI/issues/221#issuecomment-107156044","issue_url":"https://api.github.com/repos/SpongePowered/SpongeAPI/issues/221","id":107156044,"user":{"login":"ST-DDT","id":1579362,"avatar_url":"https://avatars.githubusercontent.com/u/1579362?v=3","gravatar_id":"","url":"https://api.github.com/users/ST-DDT","html_url":"https://github.com/ST-DDT","followers_url":"https://api.github.com/users/ST-DDT/followers","following_url":"https://api.github.com/users/ST-DDT/following{/other_user}","gists_url":"https://api.github.com/users/ST-DDT/gists{/gist_id}","starred_url":"https://api.github.com/users/ST-DDT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ST-DDT/subscriptions","organizations_url":"https://api.github.com/users/ST-DDT/orgs","repos_url":"https://api.github.com/users/ST-DDT/repos","events_url":"https://api.github.com/users/ST-DDT/events{/privacy}","received_events_url":"https://api.github.com/users/ST-DDT/received_events","type":"User","site_admin":false},"created_at":"2015-05-31T10:54:49Z","updated_at":"2015-05-31T10:54:49Z","body":"Some method declarations in [`DataHolder`](https://github.com/SpongePowered/SpongeAPI/blob/master/src/main/java/org/spongepowered/api/data/DataHolder.java) are generic although they don't have to. This leads to worse usability / more raw casts.\r\n````java\r\nDataHolder holder = null;\r\nDataManipulator<?> data = null;\r\nholder.offer(data); // Does not compile\r\nholder.offer((DataManipulator) data);\r\n````\r\nThat offer is usually used in for each loops like [`SpongeItemStackBuilder`](https://github.com/SpongePowered/SpongeCommon/blob/master/src/main/java/org/spongepowered/common/item/SpongeItemStackBuilder.java#L130).\r\n\r\n* `<T extends DataManipulator<T>> boolean remove(Class<T> manipulatorClass)`\r\n* `<T extends DataManipulator<T>> boolean isCompatible(Class<T> manipulatorClass)`\r\n* `<T extends DataManipulator<T>> DataTransactionResult offer(T manipulatorData)`\r\n* `<T extends DataManipulator<T>> DataTransactionResult offer(T manipulatorData, DataPriority priority)`\r\n\r\nThey should be declared this way:\r\n* `boolean remove(Class<? extends DataManipulator<?>> manipulatorClass)`\r\n* `boolean isCompatible(Class<? extends DataManipulator<?>> manipulatorClass)`\r\n* `DataTransactionResult offer(DataManipulator<?> manipulatorData)`\r\n* `DataTransactionResult offer(DataManipulator<?> manipulatorData, DataPriority priority)`\r\n\r\nor that way:\r\n* `<T extends DataManipulator<?>> boolean remove(Class<T> manipulatorClass)`\r\n* `<T extends DataManipulator<?>> boolean isCompatible(Class<T> manipulatorClass)`\r\n* `<T extends DataManipulator<?>> DataTransactionResult offer(T manipulatorData)`\r\n* `<T extends DataManipulator<?>> DataTransactionResult offer(T manipulatorData, DataPriority priority)`"}}