2017-02-21 81 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将在哪个上下文中使用? –