在研究Effective Java 2nd Edition的项目23时,我决定尝试使用具有带混合对象参数列表的原始集合的构造函数实例化对象。我认为编译器会拿起我试图将一个原始类型传递给构造函数。但是,编译器只会提供一个未经检查的异常警告,“在调用者而不是被调用者。”如何在对象实例化之前确保参数化类型的有效性
该类编译得很好,进一步支持Josh Bloch声明不要在新代码中使用原始类型。这个编译的事实对我来说有点令人不安。
Q?在实例化对象之前,如何确保类的类型安全性不必在构造函数中手动检查对象的有效性?以下仅仅提供了“来自主调用者...”的未经检查的分配警告。如何防御性地对此进行编程。
public class RawType {
private final Collection<Example> example;
public RawType(Collection<Example> example) {
this.example = example;
}
public Collection<Example> getExample() {
return example;
}
public static void main(String[] args) {
Collection unsafe = new ArrayList();
unsafe.add(new Example());
unsafe.add(new Corruption());
unsafe.add(new Example());
RawType rawType = new RawType(unsafe); // Corruption
for(Object type : rawType.getExample()) {
System.out.println(type.getClass().getName()); // Mixed Classes...
}
}
static class Corruption {}
static class Example{}
}
不要忽视警告以避免这种情况。 – Braj 2014-10-07 06:46:38
警告不在“被调用者”(构造函数)处,因为它没有任何问题。问题在于调用者,在那里你使用原始类型,你应该使用适当的泛型类型。对于警告也是在被调用方,它不得不说“这个构造函数/方法在其他地方没有被正确地使用”,并且不会引起注意。 – kajacx 2014-10-07 21:26:50
我明确指出,“主叫”主要考虑你正在建立一个API,并且有人发送一个原始类型......你如何在没有手动验证的情况下防御性地对它进行编程。就是那个问题。 – 2014-10-07 21:30:38