我定义了一个参数化界面:
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
选项进行编译时,为什么编译器没有显示{{1}}无法添加类型参数的警告?事实上,它成功编译。
答案 0 :(得分:2)
-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)。所以选项&#34; -Xlint:rawtypes&#34;在这里确实会有所帮助。
答案 1 :(得分:2)
如果您想查看警告,则应使用
-Xlint:rawtypes
而不是
-Xlint:unchecked
对于Maven构建,请参阅: http://maven.apache.org/plugins/maven-compiler-plugin/examples/pass-compiler-arguments.html
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<compilerArgument>-Xlint:rawtypes</compilerArgument>
</configuration>
</plugin>