您好我在使用java中的泛型類型時遇到了問題。實際的問題是,當我在方法聲明上使用泛型時工作正常。然後,如果我添加一個泛型類型的接口聲明代碼不會編譯。以下是工作代碼:爲什麼JAVA無法在接口中使用泛型時編譯
public interface IRuntimeConvert {
public <T> T convertInstanceOfObject(String o, Class<T> clazz);
}
public class RuntimeConvertImpl implements IRuntimeConvert {
private final Map<String, Object> hashMap;
public RuntimeConvertImpl(Map<String, Object> hashMap) {
this.hashMap = hashMap;
}
@Override
public <T> T convertInstanceOfObject(String o, Class<T> clazz) {
try {
return clazz.cast(hashMap.get(o));
} catch (ClassCastException e) {
return null;
}
}
}
public static void main(String[] args) {
Map<String, Object> hashMap = new HashMap<>();
hashMap.put("s", "string");
hashMap.put("i", 0);
hashMap.put("l", 0L);
IRuntimeConvert rtConvert = new RuntimeConvertImpl(hashMap);
String s = rtConvert.convertInstanceOfObject("s", String.class);
System.out.println(s);
Integer i = rtConvert.convertInstanceOfObject("i", Integer.class);
System.out.println(i);
Long l = rtConvert.convertInstanceOfObject("l", Long.class);
System.out.println(l);
}
上面的代碼正在編譯。當我做出以下更改時,代碼不可編譯。
public interface IRuntimeConvert<S> {
public <T> T convertInstanceOfObject(String o, Class<T> clazz);
public S getSomething(S s);
}
public class RuntimeConvertImpl implements IRuntimeConvert<Object> {
private final Map<String, Object> hashMap;
public RuntimeConvertImpl(Map<String, Object> hashMap) {
this.hashMap = hashMap;
}
@Override
public <T> T convertInstanceOfObject(String o, Class<T> clazz) {
try {
return clazz.cast(hashMap.get(o));
} catch (ClassCastException e) {
return null;
}
}
@Override
public Object getSomething(Object s) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
在主類上述變化之後予encouted投誤差的方法rtConvert.convertInstanceOfObject(「S」,String.class)的每個調用錯誤消息的類型:
Incompatible types: Object cannot be converted to String.
如果我嘗試運行主體,我會得到:線程「main」中的異常java.lang.RuntimeException:不可編譯的源代碼 - 不兼容的類型:java.lang.Object不能轉換爲java.lang.String
類型刪除。 Java泛型不像C++模板:https://docs.oracle.com/javase/tutorial/java/generics/erasure.html – duffymo
您好cparaskeva - 你可以編輯你的問題,包括更多的細節如何以及它不編譯? –
如果出現錯誤,請始終包含錯誤消息。 – Thilo