为什么JAVA在接口中使用泛型类型时无法编译
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么JAVA在接口中使用泛型类型时无法编译,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2412字,纯文字阅读大概需要4分钟。
内容图文
![为什么JAVA在接口中使用泛型类型时无法编译](/upload/InfoBanner/zyjiaocheng/735/60a93936022445b985b7fc06ccdd58c7.jpg)
您好我在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.");
}
}
在主类中的上述更改之后,我为每次调用方法rtConvert.convertInstanceOfObject(“s”,String.class)时出现了类型转换错误,并显示错误消息:
Incompatible types: Object cannot be converted to String.
如果我尝试运行main我得到:线程“main”中的异常java.lang.RuntimeException:无法编译的源代码 – 不兼容的类型:java.lang.Object无法转换为java.lang.String
解决方法:
发生这种情况是因为您已使用以下行将实现中的泛型类型指定为Object:
public class RuntimeConvertImpl implements IRuntimeConvert<Object> {
因此,对getSomething的调用将始终必须返回一个Object.但是,由于String是Object的子类,因此无法自动转换为String,您必须执行以下操作:
String s = (String) rtConvert.getSomething();
请注意,这不保证类型安全,并可能导致ClassCastExceptions.
内容总结
以上是互联网集市为您收集整理的为什么JAVA在接口中使用泛型类型时无法编译全部内容,希望文章能够帮你解决为什么JAVA在接口中使用泛型类型时无法编译所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。