我定义了一个参数化接口:

import com.google.common.base.Optional;

public interface AbstractResource<S extends Parent> {

    Optional<S> getOption();
    Optional<S> getAbsent();
    Optional<S> getNull();
}


然后,我将其实现为raw type。观察到我通过返回相应方法的Optional类型ChildObjectInteger破坏了接口。

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”确实会在这里有所帮助。

10-05 23:05