2013-06-27 29 views
0

剛跳進Java的泛型和我碰到一個有點問題:我似乎無法調用參數化類型的方法:如何調用參數化類型的方法?

class test 
{ 
    public static void main(String args[ ]) 
    {  
     invoke_baz(new foo()); 
    } 
    public static <Type> void invoke_baz(Type object) 
    { 
     object.baz(); 
    } 
    public static class foo 
    { 
     public void baz() 
     { } 
    }  
} 

缺少什麼我在這裏?

回答

5

你已經聲明瞭你的泛型類型參數Type,但它可以是任何東西,而不僅僅是foo,比如String

限制type有一個上限,讓你知道它是某種foo

public static <Type extends foo> void invoke_baz(Type object) 

或者,只是要求在你的論點一foo,消除對仿製藥的任何需求:

public static void invoke_baz(Foo object) 
+0

+1您的建議使用多態而不是泛型 –

+0

所以換句話說,Java泛型不是一個泛型編程工具,因爲它是「一點點語法糖」,以減輕用戶在某些情況下必須進行明確強制轉換 - 得到它! :)我想我只需要依賴於我在使用C時學到的那些老式的「複製,粘貼,搜索和替換」技術...... – SeaBass

+0

Java中的泛型適用於類(或方法)與特定的未知類型有關係。這裏的類型是已知的:'foo',所以泛型是不必要的。 – rgettman

0

Java不是duck類型,類型檢查器無法認識到泛型方法正在調用可傳遞給方法的對象上可用的方法。無論您的具體情況如何,它都必須正確地檢查通用代碼。

您需要通過顯式聲明的類型變量fullfil這僅限於類一定的層次結構,使類型檢查可以在其上做出假設:

interface Bazzable { 
    public void baz(); 
} 

public <Type extends Bazzable> void invoke(Type object) { 
    object.baz(); 
} 

public class Foo implements Bazzable { 
    public void baz() { 
    System.out.println("baz"); 
    } 
} 

這樣您指定的類型變量至少爲Bazzable,因此您將被限制爲僅將某些類型傳遞給該方法,但在另一方面,您將能夠調用Bazzable中指定的任何方法。

0

你不能因爲它是一個泛型類型在編譯時不知道。編譯器不知道類型是什麼 - 你也不知道。一種方法是做一個運行時間轉換。你首先需要決定你所期望的是什麼類型的,你可以做這樣的事情:

public static <Type> void invoke_baz(Type object) 
{ 
    SomeClass someClass = (SomeClass) object; 
    someClass.baz(); 
} 

這將ofcourse生產投錯誤,如果提供的對象/類型是SomeClass類型的不行。

更好的辦法是宣佈了一個接口,確保你的方法的合約,如:

public interface HaveBaz { 
    baz(); 
} 

,並要求該接口的亞型對你的泛型方法聲明

public static < Type extends HaveBaz > void invoke_baz(Type object) 
{ 
    object.baz(); 
} 
相關問題