原始类型无警告

时间:2014-06-04 12:31:35

标签: java generics

我定义了一个参数化界面:

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类型ObjectIntegerpublic 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}}无法添加类型参数的警告?事实上,它成功编译。

2 个答案:

答案 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>