Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一般生产者和消费者_Java_Generics - Fatal编程技术网

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);
}