Java 一般生产者和消费者
我正在设计一个容器类,用于保存Java 一般生产者和消费者,java,generics,Java,Generics,我正在设计一个容器类,用于保存 public interface MetaData<ValueType>{ public String getName(); } 在哪里 public interface Parameters { public Object getValue(MetaData<?> pmd); public <M> void put(MetaData<M> p, M value); } 公共接口参数{
public interface MetaData<ValueType>{
public String getName();
}
在哪里
public interface Parameters {
public Object getValue(MetaData<?> pmd);
public <M> void put(MetaData<M> p, M value);
}
公共接口参数{
公共对象getValue(元数据pmd);
公共作废put(元数据p、M值);
}
问题是,当客户端调用方法对象getValue(元数据pmd)
时,它们必须执行显式强制转换:
MetaData<List<Integer>> metaData;
Paramters params;
List<Integer> list= new ArrayList<>();
//intialization
params.put(metaData, list);
//do some other
List<Integer> lst = (List<Integer>) params.getValue(metaData);
元数据;
参数参数;
列表=新的ArrayList();
//初始化
参数put(元数据、列表);
//做些别的
List lst=(List)params.getValue(元数据);
虽然强制转换是完全安全的,但我希望避免它,并提供某种通用方法。但当我尝试这一宣言时:
public <M> M getValue(MetaData<M> pmd);
public M getValue(元数据pmd);
我在实现中遇到一个编译错误:
public <M> M getValue(MetaData<M> pmd) {
return parameters.get(pmd); //cannot convert capture-of-#1 to M
}
public M getValue(元数据pmd){
返回参数.get(pmd);//无法将-1的捕获转换为M
}
问题:是否有方法泛化方法
公共对象getValue(元数据pmd)代码>以任何方式?您只需转换从映射中检索到的值:
public <M> M getValue(MetaData<M> pmd) {
return (M) parameters.get(pmd);
}
public M getValue(元数据pmd){
返回(M)个参数。获取(pmd);
}
但此时编译器抱怨它无法检查强制转换。这是什么意思?好的,Java源代码中的普通强制转换是用(SomeType)val
表示的-编译器检查操作是否完全非法(例如,您不能将字符串
引用强制转换为整数
),并在运行时发出一个字节码,当它可能抛出ClassCastException
时执行该字节码
当您使用类型变量强制转换引用时,编译器无法发出此类字节码,因为类型变量在运行时不存在,因此会发出编译警告。你应该:
- 确保使用正确的值填充映射
- 使用
@SuppressWarnings(“未选中”)
您的hashmap被声明为具有值类型对象
。想必这应该是某种泛型类型…?你能在getValue
内部进行强制转换吗?简单地强制转换:返回(M)参数。获取(pmd)
并用@SuppressWarnings(“unchecked”)
@Raffaele该死的,这就像天才一样简单。非常感谢。您不能使用参数
和获取值(元数据pmd)
public <M> M getValue(MetaData<M> pmd) {
return (M) parameters.get(pmd);
}