2015-06-17 46 views
1

編譯此示例代碼(在failed()方法中)時出現意外錯誤。的IntelliJ使用不報告在IDE中的錯誤,但它已經開始彙報(一些類是在一個庫中,這似乎混淆)Java通用類型在沒有中間變量的情況下失敗

public class Main { 

    // The command 
    public interface ToMessageOperation<MODEL, MESSAGE> { 

     void run(MODEL object, MESSAGE message) throws Exception; 
    } 

    // A command 
    public class SelfLink<MODEL> implements ToMessageOperation<MODEL, LinkedMessage> { 

     @Override 
     public void run(MODEL object, LinkedMessage linkedMessage) throws Exception { 

     } 
    } 

    // A message type 
    public interface LinkedMessage { 

     void linkme(); 
    } 

    // A message 
    public interface BootInfo extends LinkedMessage { 
    } 

    //The Executor 
    public interface GetRequest<MODEL, MESSAGE> { 

     GetRequest<MODEL, MESSAGE> runAll(ToMessageOperation<? super MODEL, ? super MESSAGE>... operations); 
     GetRequest<MODEL, MESSAGE> cleanUp(); 
     MESSAGE now(); 
    } 

    // The command factory 
    public SelfLink selfLink() { 
     return null; 
    } 

    public <MODEL, MESSAGE> GetRequest<MODEL,MESSAGE> get(Class<MESSAGE> message) { 

     return null; 
    } 

    public BootInfo works() { 

     return get(BootInfo.class).cleanUp().now(); 
    } 

    public BootInfo alsoWorks() { 

     return get(BootInfo.class).runAll(new ToMessageOperation<Object, BootInfo>() { 
      @Override 
      public void run(Object object, BootInfo bootInfo) throws Exception { 

      } 
     }).now(); 
    } 

    public BootInfo surprisedItWorks() { 

     return get(BootInfo.class).runAll(new ToMessageOperation<Object, LinkedMessage>() { 
      @Override 
      public void run(Object object, LinkedMessage message) throws Exception { 

      } 
     }).now(); 
    } 

    public BootInfo fails() { 

     return get(BootInfo.class).runAll(new SelfLink()).now(); 
    } 

} 

我有點意外的是,錯誤只發生在我添加runAll()方法時,因爲所有方法都返回相同的對象。

我真的很驚訝,該方法適用於從失敗的情況下分配的不同類型(其中ToMessageOperation類型被繼承而不是顯式)。即使這樣也不應該改變返回類型,對吧?

我做錯了什麼?

+0

我想你沒有太多選擇。你可以這樣做:return get(BootInfo.class).runAll(selfLink())。 now();或使用@SuppressWarnings。看到這裏:http://stackoverflow.com/questions/450807/how-do-i-make-the-method-return-type-generic – mttdbrd

+0

你的代碼似乎不完整。 'BootResource.get()'應該是靜態的嗎?一個實際的可構建的,可運行的例子將有所幫助。 – markspace

+0

@markspace'BootResource.get()'不應該是靜態的(它在這個例子中)。我同意,整個可編輯的例子可以幫助(我只是試圖減少噪音)。我今天晚些時候會解決這個問題。 –

回答

0

我迅速修復它通過將上SelfLink

public class SelfLink<MODEL,MESSAGE extends LinkedMessage> implements ToMessageOperation<MODEL, MESSAGE> { 


    @Override 
    public void run(MODEL object, MESSAGE linkedMessage) throws Exception { 

     linkedMessage.linkme(); 
    } 
} 

public <MODEL,MESSAGE extends LinkedMessage> SelfLink<MODEL, MESSAGE> selfLink() { 

    return null; 
} 

明確泛型參數使用工廠類selflink,代碼如下所示:

public BootInfo fails() { 

    return get(BootInfo.class).runAll(selfLink()).now(); 
} 

我不明白這是爲什麼在java 8中是必要的,但使用非常相當。如果我得到更好的解釋,我會接受它作爲答案。

相關問題