回答編集履歴

2

ジェネリクスの境界宣言を間違えていたので修正

2016/10/28 01:28

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  ```java
44
44
 
45
- public <T> T GetComponent(Class<T extends TG_Component> clazz){
45
+ public <T extends TG_Component> T GetComponent(Class<T> clazz){
46
46
 
47
47
  for(TG_Component component: components){
48
48
 

1

追記

2016/10/28 01:27

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -27,3 +27,45 @@
27
27
  ```
28
28
 
29
29
  ただ全体としては追加・修正依頼に書いたとおり、TG_ComponentとTの関係性がよくわからないので、クラスとしてジェネリクス宣言させたほうがいいのか否かがわかりません。
30
+
31
+
32
+
33
+ ---
34
+
35
+
36
+
37
+ 追記
38
+
39
+ この様子だとTG_GameObjectの1つ目2つ目のメソッドに<T>は不要に思えます(いずれも返り値をTG_Componentにする)。1つ目は返り値として引数を返す意味も無いように思えますし、共通で実行時にClassCastExceptionが発生する恐れがあります。
40
+
41
+ また先程のメソッドは次のようにすればより安全かと思われます。
42
+
43
+ ```java
44
+
45
+ public <T> T GetComponent(Class<T extends TG_Component> clazz){
46
+
47
+ for(TG_Component component: components){
48
+
49
+ if(clazz.isInstance(component)){
50
+
51
+ return clazz.cast(component);
52
+
53
+ }
54
+
55
+ }
56
+
57
+ return null;
58
+
59
+ }
60
+
61
+ ```
62
+
63
+ で、呼び出し時には
64
+
65
+ ```java
66
+
67
+ gameObject.GetComponent(Bullet.class).shot();
68
+
69
+ ```
70
+
71
+ の様にします。ただこれだとGetComponentがnullを返した際にNullPointerExceptionになるので、nullチェックは必須です。