2017-10-12 19 views
3

チェックされたメソッドのJava 7では、コンパイルエラーが発生しますが、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

、それはJavaの7 – assylias

+0

@assylias右でコンパイルしない理由Tは...わからないオブジェクトですが、それは一種であり、問題の核心点の:) – lexicore

+1

質問にコンパイルエラーを含めることはできますか? – Henrik

答えて

1

ジェネリック型パラメータTObjectあるので、コンパイルエラーを引き起こす行動ないは、ここに正しいです。コンパイラは、型パラメータが指定されていない場合、どのように推測する必要がありますか?私は、Java 7がそれをどうやって行ったのだろうと思っています。

この1つはしかし、コンパイルエラーにつながる:あなたの例では

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

コンパイラは、指定されていない型パラメータを実際に推測できます。実際には、それは型推論ではないと推測しています。 Oracle Javaチュートリアルの[型推論記事](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

関連する問題