2017-10-12 49 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