Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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/3/android/213.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_Android - Fatal编程技术网

如何在Java中提示两个类型参数实际上是相同的类型?

如何在Java中提示两个类型参数实际上是相同的类型?,java,android,Java,Android,我正在使用AOSP及其相关类,需要将设置键值从CaptureRequest的现有实例复制到CaptureRequest.Builder1的新实例中(尽管这种情况非常罕见) 这里我要运行的基本代码如下: for(CaptureRequest.Key:request.getKeys()){ builder.set(key,request.get(key)); } 。。。其中CaptureRequest.Builder.set()函数定义为void set(Key,T值),而CaptureReque

我正在使用AOSP及其相关类,需要将设置键值从
CaptureRequest
的现有实例复制到
CaptureRequest.Builder
1的新实例中(尽管这种情况非常罕见)

这里我要运行的基本代码如下:

for(CaptureRequest.Key:request.getKeys()){
builder.set(key,request.get(key));
}
。。。其中
CaptureRequest.Builder.set()
函数定义为
void set(Key,T值)
,而
CaptureRequest.get()
定义为
T get(Key)
。 但这会使编译器产生以下错误:

Source.java:2:错误:类生成器中设置的方法无法应用于给定类型;
builder.set(key,request.get(key));
^
所需:钥匙,T
找到:钥匙,第2章
原因:推断类型不符合下限
推断:第1章
下限:对象
其中T是一个类型变量:
T扩展方法集中声明的对象(键,T)
其中,CAP#1、CAP#2是新类型变量:
CAP#1将对象从捕获扩展到?
CAP#2将对象从捕获扩展到?
如果我对错误的解释是正确的,它试图说它不能将两个函数的
s关联为同一个
T
。因此,为了给它一个提示,说明它是相同的
T
,我创建了一些帮助函数,可以很明显地看出它是相同的
T
,因此我有以下内容:

private static T getKeyValue(CaptureRequest请求,CaptureRequest.Key){
return(T)request.get(key);
}
私有静态无效setKeyValue(CaptureRequest.Builder、CaptureRequest.Key){
set(key,(T)MyClass.getKeyValue(key));
}
.....
for(CaptureRequest.Key:request.getKeys()){
setKeyValue(生成器,键);
}
这无法安抚Java编译器,它会抛出与前一个非常类似的错误:

Source.java:6:错误:MyClass类中的方法getKeyValue无法应用于给定类型;
set(key,(T)MyClass.getKeyValue(key));
^
必需:CaptureRequest,密钥
找到:键
原因:实际参数列表和正式参数列表长度不同
其中T#1,T#2是类型变量:
T#1扩展方法getKeyValue(CaptureRequest,Key)中声明的对象
T#2扩展方法setKeyValue(生成器,键)中声明的对象
我如何才能以理智的方式执行键值的这个[应该是简单的]拷贝


1是的,我知道这很奇怪,有点落后于API的典型用法,因此“不寻常”。上下文是,已经构建的请求(超出库的范围)正在渗透到一个库中,该库需要使用自己的请求对请求进行阴影处理,大多数情况下模仿原始请求,但稍作修改,并且说该库无权访问原始构建器来构建阴影同级请求。是的,这很奇怪,超出了这个问题的范围。这个问题实际上是关于Java的模板方法和明显的编译错误。

为什么不只是:

builder.set((CaptureRequest.Key)键,request.get(Key))


非常确定它应该能工作。

看起来
setKeyValue
的实现应该是
builder.set(key,request.get(key))
@LouisWasserman,在任何地方使用
T
setKeyValue
的目的是通过直接告诉编译器类型之间的关系来安抚编译器,而不是让它使用似乎不成功的类型推断。这就是为什么
T
在任何可能的地方都被播种(但没有帮助)。但是沙多夫下面的回答做到了这一点,而不需要
setKeyValue
甚至
getKeyValue
函数。您可以在不使用任何强制转换、不安全或其他功能的情况下实现这一点。