2017-02-21 189 views
2

以下代碼會產生「未檢查或不安全的操作」警告,如何在不引起警告的情況下投入Objecto以鍵入T?我知道我可以壓制警告,但我想知道「正確」的方式。如何轉換爲泛型?

public class MyType<T> { 
    T cast(Object o) { 
     return (T)o; //<--- what causes the warning 
    } 
} 
+0

你在做什麼不是類型安全的,所以是的,你會得到一個警告,它不是類型安全的。 –

回答

8

Type erasure。你可以傳遞Class<T>作爲參數,並使用它。像,

T cast(Class<T> cls, Object o) { 
    return cls.cast(o); 
} 

甚至

public class MyType { 
    public static <T> T cast(Class<T> cls, Object o) { 
     return cls.cast(o); 
    } 
} 

,你可以調用像

int t = MyType.cast(Integer.class, 10); 

或者,但在同一行,你可以在構造函數傳遞Class

public class MyType<T> { 
    public MyType(Class<T> cls) { 
     this.cls = cls; 
    } 

    private Class<T> cls; 

    T cast(Object o) { 
     return cls.cast(o); 
    } 
} 

,然後用它像

MyType<Integer> myType = new MyType<>(Integer.class); 
int t = myType.cast(10); 
+0

嗨Elllioitt你如何通過類作爲論據?你能給我一個具體的例子嗎? – Tania

+0

'String foo = cast(String.class,「foo」);' – Izruo

+0

@Tania你需要什麼樣的投射方法? MyType將在哪個上下文中使用? –