2017-10-12 62 views
3

在Java 7中,checked方法的不同类型导致编译错误,而在Java 8中不存在编译错误。是否可以保持泛型的检查并使其在Java 8中产生编译错误?Java 8通用类型检查

class CheckedEquals{ 
    public static <T> boolean checked(T expected, T actual) { 
     return com.google.common.base.Objects.equal(expected, actual); 
    } 
} 

class ShouldFailAtCompileTime{ 
    public void foo(){ 
     if(CheckedEquals.checked("String", Boolean.TRUE)){ 
      System.err.println(""); 
     } 
    } 
} 
+3

在你的榜样,T为对象...不知道为什么它不与Java 7 – assylias

+0

@assylias正确编译但它是一种这个问题的核心观点。 :) – lexicore

+1

你可以在问题中包含编译错误? – Henrik

回答

1

行为引起编译错误是正确的在这里,因为泛型类型参数TObject。如果未指定,那么编译器应该如何猜测类型参数?我想知道Java 7如何做到这一点,据我所知没有任何变化。

这一个会导致然而编译错误:

CheckedEquals.<String>checked("String", Boolean.TRUE) 
+1

编译器实际上可以猜到未指定的类型参数。事实上,它并不是猜测它是类型推断。请参阅Oracle Java教程中的[type inference article](https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html)。从我可以记得的类型推断在Java 8中得到了改进(另请参阅https://blog.jooq.org/2013/11/25/a-lesser-known-java-8-feature-generalized-target-type-推理/)。我的猜测是,Java 7不能推断'T'的类型,但是Java 8和改进后的推理可以。在这种情况下,Java 8推断'T'为'Object'。 –

+0

我认为Java 7猜测预期和实际必须具有相同的类型。 – user2290533