我定义了一个参数化接口:
import com.google.common.base.Optional;
public interface AbstractResource<S extends Parent> {
Optional<S> getOption();
Optional<S> getAbsent();
Optional<S> getNull();
}
然后,我将其实现为raw type。观察到我通过返回相应方法的
Optional
类型Child
,Object
和Integer
破坏了接口。public class FooResource implements AbstractResource { // Did not add type parameter
@Override
public Optional<Child> getOption() {
Child child = new Child("John");
return Optional.of(child);
}
@Override
public Optional<Object> getAbsent() {
return Optional.absent();
}
@Override
public Optional<Integer> getNull() {
return null;
}
}
使用
-Xlint:unchecked
选项进行编译时,为什么编译器没有显示FooResource
添加类型参数失败的警告?实际上,它可以成功编译。 最佳答案
-Xlint:unchecked
用于未经检查的转换(也称为强制转换)。它与使用原始类型无关。使用选项-Xlint
编译类。然后,您将获得预期的输出:
FooResource.java:3: warning: [rawtypes] found raw type: AbstractResource
AbstractResource
^
missing type arguments for generic class AbstractResource<S>
where S is a type-variable:
S extends Parent declared in interface AbstractResource
1 warning
我建议使用IDE。例如,Eclipse可以立即显示此类警告。
我刚发现,Java 7支持更多的"Xlint" options(比Java 6支持更多)。因此,选项“ -Xlint:rawtypes”确实会在这里有所帮助。