2015-01-11 39 views
-1
abstract class A 
{ 
    abstract public A anyMethod(); 
} 
class B extends A 
{ 
    @Override 
    public B anyMethod() 
    { 
     return (new B()); 
    } 
} 
class C<V extends A> 
{ 
    V temp1,new_temp; 
    public void c_method() 
    { 
    temp1 = new_temp.anyMethod(); 
    } 
} 
public class test 
{ 
    public static void main(String args[]) 
    { 

    } 
} 

當我寫在類C <V extends A>和(anyMethod返回類A中的A)中,如何將由anyMethod返回的對象分配給引用V類型變量?

temp1 = (V) new_temp.anyMethod 

編譯器顯示: 注:/home/workstation/Desktop/new/test.java使用未經檢查或不安全的操作。 注意:使用-Xlint重新編譯:取消選中以獲取詳細信息。 現在,我知道已經創建了一個類文件,但是如何刪除「未選中或不安全的操作」。有沒有「安全」的方式來實現上述?

+0

這編譯就好了。根據定義,「B」的一個實例也是「A」的一個實例。你使用什麼編譯器/ IDE? – Mureinik

+0

對不起!更正了這個問題。 – NewbieCoder

+0

如果你想讓它工作,你必須將B中方法的返回類型更改爲B. –

回答

0

編譯器可能沒有認識到B是A型 也許嘗試這種在重寫的方法:

A a = this; 
return a; 

這樣編譯器會知道你有一個類型變量返回的對象。

編輯:我上面的答案是錯誤的。您的更新後,這個問題很清楚,anyMethod返回一個引用類型的對象,但你也因此設置爲引用類型B.,你需要的類型轉換,所以:

B b2 = (B)b1.anyMethod(); 
1

編譯器看到該方法的聲明返回類型爲A.不重要的是您實際返回的是B.最簡單的方法是修改B中方法的返回類型爲B.

+0

這很可能是最安全的方法。 – Makoto

4

B b2 = (B) b1.anyMethod()你必須將其轉換爲B

或者

更改爲B返回類型的public A anyMethod()

0

一個解決方案是更改覆蓋方法的返回類型。當你重寫一個方法時,你不允許改變參數的類型。但是,如果新結果類型是要覆蓋的方法的結果類型的子類,則您可以使用更改結果類型。因此,這是合法的:

abstract class A 
{ 
    abstract public A anyMethod(); 
} 
class B extends A 
{ 
    @Override 
    public A anyMethod() 
    { 
     return this; 
    } 
} 

結果類型不一定與您要擴展的類相關。這也是合法的:

abstract class A 
{ 
    abstract public CharSequence anyOtherMethod(); 
} 
class B extends A 
{ 
    @Override 
    public String anyOtherMethod() 
    { 
     return "that"; 
    } 
} 

因爲String工具CharSequence。重要的是,任何具有A並且調用此方法的代碼都會得到CharSequence的結果仍然會得到它,因爲每個String都是CharSequence。其結果是,當編譯器知道它的工作與B對象,它可以承擔的方法的結果將在較窄類:

B b1 = new B(); 
    B b2 = b1.anyMethod(); 
    String s1 = b1.anyOtherMethod(); 

在另一方面:

A b3 = new B(); 
    B b4 = b3.anyMethod(); // illegal 
    String s2 = b3.anyOtherMethod(); // illegal 

AREN不允許,因爲編譯器必須將b3視爲它可能屬於的任何子類A

(這被稱爲協方差,我不相信這是在早期版本的Java支持,但我不知道是什麼版本的介紹了吧。)

相關問題