2016-04-13 50 views
-3

我有一個通用的方法,在特定的場景中返回一個布爾值。if子句和泛型方法返回布爾型

我的方法的方法簽名是例如

public <T> T get() { return Boolean.true;} 

直到這裏,它工作正常,沒有編譯器錯誤。 雖然,當我嘗試,如果子句中使用相同的一個,像

if(get()) 

然後返回錯誤說

類型不匹配:不能從對象轉換爲Boolean

而且我懷疑這只是發生在日食。這是一個現有的代碼,我正在嘗試在我的工作區中進行編譯。

請幫忙。

更新:

本文介紹了目標類型推斷以及 - https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html

,並通過@Codebender下面解釋,推理的TargetType行之有效的鏈接/嵌套的方法,雖然它看起來像它不會對語言結構的工作一樣,如果爲,而等 我試着寫下面的方法 -

public void test(boolean val) 

,並試圖調用它就像

test(get()) 

它工作正常。

解決方案:

最後,在這段代碼中,我最終加入明確的類型轉換一樣

if((Boolean)get()) 

,它爲我工作。

+0

'get()'在這裏用作原始類型,因此它返回一個'Object'。一個「對象」不代表一個有效的條件。 – SomeJavaGuy

+1

你能分享一下嗎?另外,爲什麼這種方法需要通用?你知道你正在返回一個布爾值,你的'if'語句將它視爲一個布爾值 - 爲什麼不把它定義爲這樣呢? – Mureinik

+0

這個神奇的'get()'方法是如何工作的,它可以返回任何所需類型的值,而不必知道該類型是什麼?沒有(正確)擾亂編譯器的這種方法可以返回唯一的結果是'null'。 – Misha

回答

0

該代碼將在Java 8中正常工作(因爲廣義類型推斷)...但不在Java 7及更低版本中。

見我這個答案,知道什麼是廣義的類型推斷是:https://stackoverflow.com/a/32294457/2775450,也這樣:https://stackoverflow.com/a/28474319/2775450

除此之外,你的代碼似乎也有其他錯誤的,喜歡它的Boolean.TRUE而不是Boolean.true,你應該有在return語句中明確地轉換爲T

+0

是的,布爾。實踐可能是一種類型。實際上它不是Boolean.TRUE,還有其他一些陳述。我把Boolean.TRUE簡化了語句。 –

+0

實際上我正在編譯對付java 8,這就是爲什麼我對這個錯誤感到驚訝。有沒有什麼與日食?除編譯器設置的源代碼級別外? –

+0

@AnandVaidya,不確定...它應該可以在Java 8上工作...如果你真的使用Java-8 ... – Codebender

2

要做到這一點:

if(get()) 

你需要有一個像get方法的這樣的返回類型的布爾:

public <T> boolean get() {... 
+0

它是一個現有的代碼,我相信它會在其他環境中編譯。我不想改變它。 –

0

你爲什麼不定義你的方法

public <T> boolean get() { return Boolean.TRUE;} 

在這種情況下,您將不會收到編譯錯誤,並按照原樣定義返回參數。在您的原始定義中,您希望該方法返回T而不是boolean

更新:您的代碼不使用泛型。並且在您計劃使用的if語句中沒有可以使用通用返回值的方法,因爲Java沒有像腳本語言那樣的「falsy」值(例如Python)。另一種在這裏有一個通用的方法是在方法體中添加一些通用的值作爲參數,並用它做什麼:

public <T> boolean get(T some value) { return Boolean.TRUE;} 

但是,如果你想使用導致if然後考慮將類似這個:

if(get() != null) {...} 

它也可以使用通用的方法。如果您總是從get()返回boolean值,則不需要使用泛型。

+0

那麼最近使用泛型在它呢? –

0
I think this is happening because if you see in the method signature 
public <T> T get(), you are making it Generics but in the return statement, boolean value is returned. So to make it work just try to change the return type in the method signature like below:- 
public static <T> Boolean get() { 
     return Boolean.TRUE; 
} 
then use it in the if condition :- if(get()){ }