首页 / JAVA / java-如何修复此泛型示例
java-如何修复此泛型示例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-如何修复此泛型示例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2693字,纯文字阅读大概需要4分钟。
内容图文
![java-如何修复此泛型示例](/upload/InfoBanner/zyjiaocheng/682/696e8451528343c6b63c0e3fbaca1a79.jpg)
我有一个泛型问题,并创建了一个简化示例.
import java.util.HashMap;
import java.util.Map;
public class Test {
public interface Handler<T> {
public String getType();
public T getInitMessage();
public void process(T message);
}
public static class MessageType1 {
// Message type 1
}
public static class MessageType2 {
// Message type 2
}
public static void main(String[] args) {
Handler<MessageType1> messageType1Handler = new Handler<MessageType1>() {
@Override
public String getType() {
return "messageType1";
}
@Override
public MessageType1 getInitMessage() {
return new MessageType1();
}
@Override
public void process(MessageType1 message) {
System.out.println(message);
}
};
Handler<MessageType2> messageType2Handler = new Handler<MessageType2>() {
@Override
public String getType() {
return "messageType2";
}
@Override
public MessageType2 getInitMessage() {
return new MessageType2();
}
@Override
public void process(MessageType2 message) {
System.out.println(message);
}
};
Map<String, Handler<?>> handlers = new HashMap<String, Handler<?>>();
handlers.put(messageType1Handler.getType(), messageType1Handler);
handlers.put(messageType2Handler.getType(), messageType2Handler);
String type = "messageType1"; // something valid
Handler<?> handler = handlers.get(type);
handler.process(handler.getInitMessage());
}
}
它说:
Test.Handler类型的方法process(capture#4-of?)不适用于参数(capture#5-of?)
我应该如何修改我的代码以保留处理程序的集合,并且它应该能够使用适当的参数调用这些处理程序的方法?
解决方法:
编译器抱怨的是,它无法在从getInitMessage()接收的未知消息类型与handler.process()接受的消息类型之间建立联系.
一种解决方法是使用静态方法将两个类型参数显式绑定在一起:
private static <T> void process(Handler<T> handler) {
handler.process(handler.getInitMessage());
}
然后,您调用此方法,而不是handler.process(handler.getInitMessage());.
如果我们将消息显式分配给变量,则可以更好地理解为什么编译器自己无法解决这个问题:
Handler<?> handler = handlers.get(type);
? message = handler.getInitMessage();
handler.process(message);
现在, message不是有效的语法,但是我必须使用Object,因为那是MessageType1和MessageType2共有的最特定的超类,然后这将仅仅是没有任何方法handler.process(Object)的问题.
即使我们认为编译器将知道消息不是Object而是对?的某种捕获,麻烦的是它无法处理对?的捕获.与?的类型相同在Handler<?>中-因为如果这样做,它将编译为:
Handler<?> handler = handlers.get(type);
? message = handler.getInitMessage();
handler = handlers.get(anotherType); // added this
handler.process(message);
如果您让自己认为两个?都引用同一类型,则不能仅使用静态类型检查来阻止我这样做.
通过使用上面建议的静态方法,我们绑定了?的含义.在静态方法的持续时间内,以便编译器可以将其视为相同类型.我每次都可以使用不同的类型参数输入静态方法,但是它不能在内部更改-编译器将确保在静态方法内部进行更改.
内容总结
以上是互联网集市为您收集整理的java-如何修复此泛型示例全部内容,希望文章能够帮你解决java-如何修复此泛型示例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。