我有一个容器,可以持久保存实现Comparable
接口的不同类型的值。我需要按如下方式比较这些值:
UpperLowerContainer values;
//initializing the container
Comparable<?> upper = (Comparable<?>) values.getUpper();
Comparable<?> lower = (Comparable<?>) values.getLower();
if (upper.compareTo(lower) < 0){ //This is not compiled
//do some
}
由于显而易见的原因,代码未编译。捕获lower
的通配符不能转换为捕获upper
的wildacrd,反之亦然。
但我该如何解决这个问题呢?有什么想法吗?
UPD:容器中存储的值的类型相同。在将它们存储到它之前有一个验证。
答案 0 :(得分:0)
你的班级$this->attributeMock
->expects($this->at(1))
->method('getData')
->with('additional_data')
->willReturn('some value');
$this->attributeMock
->expects($this->at(0))
->method('getData')
->with('is_default')
->willReturn('something');
是什么样的?您可以使用类型参数,这样就不需要使用通配符和强制转换。例如:
UpperLowerContainer
然后:
public class UpperLowerContainer<T extends Comparable<T>> {
private final T lower;
private final T upper;
public UpperLowerContainer(T lower, T upper) {
this.lower = lower;
this.upper = upper;
}
public T getLower() {
return lower;
}
public T getUpper() {
return upper;
}
}
它不起作用的原因是因为编译器无法确定这些行中的两个通配符是否引用相同的类型:
Comparable<T> upper = values.getUpper();
Comparable<T> lower = values.getLower();
if (upper.compareTo(lower) < 0) {
// do something
}
如果您在其中一个可比较对象上调用Comparable<?> upper = (Comparable<?>) values.getUpper();
Comparable<?> lower = (Comparable<?>) values.getLower();
,则必须传递相同类型的值。但是,因为类型类型未知,所以编译器无法检查是否传递了正确类型的值,因此会出错。
答案 1 :(得分:0)
在您不指定对象类型之前,代码将不会编译。您尝试使用时不能使用通配符。 类声明应该是:
public class UpperLowerContainer<T extends Comparable<T>>
你应该使用
Comparable<T> upper = values.getUpper();
Comparable<T> lower = values.getLower();
现在你编码了
if (upper.compareTo(lower) < 0) {
// do something
}
将编译