2017-02-21 20 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? –