我有这行代码:
List<IObserver<?>> observers = new ArrayList<>();
并获得以下3个错误:
Cannot instantiate the type ArrayList<?>
Syntax error on token "<", ? expected after this token
Type mismatch: cannot convert from ArrayList<?> to List<IObserver<?>>
我正在使用Eclipse 3.7,我安装了JDK 7 update 5,并且Project设置为在Build Path中使用JRE系统库[JavaSE1.7]。
传递右边的IObserver<?>
编译得很好,但我必须使用钻石操作符。
我认为这是一个配置问题,但我无法弄清楚我错过了什么。
答案 0 :(得分:3)
只有当您在LHS中没有wildcard
作为通用类型时,Diamond运算符才会起作用..
List<IObserver<?>> observers = new ArrayList<>();
在此代码中,编译器会看到LHS,并且对List
的{{1}} IObserver
感到满意。
但是,在运行时,您需要具有此anytype
的实际类型..
如果你没有在LHS上使用anytype
,它会有效。实际上你的上面的代码相当于(如果我们在Java 7之前看到它): -
Wildcard
由于RHS泛型类型是从LHS推断出来的。现在你看到了问题?您没有List<IObserver<?>> observers = new ArrayList<IObserver<?>>();
在RHS上Concrete Type
object
。
答案 1 :(得分:3)
代码应该工作:正确使用菱形运算符。 我建议你安装一个更新版本的Eclipse(Indigo或Juno),并将编译器合规性级别设置为1.7。
这是一个简单的工作示例(这里发明了IObserver)。打印到控制台:“我们是2”
package it.ant.test;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<IObserver<?>> observers = new ArrayList<>();
IObserver<String> stringObserver = new Observer<>();
IObserver<Integer> integerObserver = new Observer<>();
stringObserver.addObserved("we are ");
integerObserver.addObserved(2);
observers.add(stringObserver);
observers.add(integerObserver);
for (IObserver<?> o : observers) {
System.out.print(o.getObserved());
}
}
}
interface IObserver<T> {
void addObserved(T t);
T getObserved();
}
class Observer<T> implements IObserver<T> {
private T observed;
@Override
public void addObserved(T observed) {
this.observed = observed;
}
@Override
public T getObserved() {
return observed;
}
}