2012-01-31 60 views
3

我目前有一個類,我希望我可以推到一個超類,因爲我將有一些其他類將需要類似的功能類中的以下方法。我可以使用泛型轉換此方法嗎?

public long convertToLong(EnumSet<SomeTypeHere> es) { 

    long a = 0; 

    for(SomeTypeHere sth : es) { 
    a += sth.someLongProperty(); 

    } 
} 

這將是偉大的,如果我能做到這一點,我從來沒有真正使用Java泛型之前,除了集合。

回答

3

您將需要對泛型類型進行綁定。如果其中包含convertToLong是同一類型參數的類,你可以把綁定的有:

import java.util.*; 
public class GenericTest<C extends GenericTest.HasLongProperty> { 
    static interface HasLongProperty { 
     long someLongProperty(); 
    } 
    public long convertToLong(Collection<C> es) { 
     long a = 0; 
     for(C sth : es) 
      a += sth.someLongProperty(); 
     return a; 
    } 
} 

或者,如果其中包含convertToLong是不是通用類,你可以把一個方法的聲明綁定單獨:

import java.util.*; 
public class GenericTest { 
    static interface HasLongProperty { 
     long someLongProperty(); 
    } 
    public <C extends GenericTest.HasLongProperty> long convertToLong(Collection<C> es) { 
     long a = 0; 
     for(C sth : es) 
      a += sth.someLongProperty(); 
     return a; 
    } 
} 
+0

這是不合法的語法 – newacct 2012-01-31 08:59:36

+0

@newacct,謝謝指出這一點。我更正了語法,並添加了一個額外的示例,顯示了2種不同的方式來聲明所需的泛型綁定。 – 2012-01-31 16:52:26

2

我想你想是這樣的:

public <T extends SomeType> long convertToLong(Collection<T> es) { 

    long a = 0; 

    for(T sth : es) { 
     a += sth.someLongProperty(); 

    } 
    return a; 
    } 

這是說,你可以在設置類型T,其中T可以是SOMETYPE的任何子類和SOMETYPE具有的功能someLongProperty的傳遞。

+0

爲什麼它是一個'Set'而不是任意的集合?對於這種技術是否適用,這些元素是否需要區分? – Borealid 2012-01-31 05:17:13

+0

這可以簡化爲'public long convertToLong(Collection <?extends SomeType> es){'和'for'行到'for(SomeType sth:es){' – newacct 2012-01-31 08:59:13

2

下面的代碼可以滿足您的需求。關鍵是使用通用語法,將類型綁定到多個類型 - 在此例中爲Enum 您的界面。

這編譯:

public interface HasSomeLongProperty { 
    long someLongProperty(); 
} 

public static enum Fruit implements HasSomeLongProperty { 
    apple(1), 
    orange() { 
     // You may override the default implementation and delegate 
     public long someLongProperty() { 
      // You could also make this a field and not new every call 
      new SomeHasSomeLongPropertyImpl().someLongProperty(); 
     } 
    }; 

    private long value; 

    private Fruit() { 
    } 

    private Fruit(long value) { 
     this.value = value; 
    } 

    public long someLongProperty() { 
     return value; 
    } 
} 

public static <T extends Enum<T> & HasSomeLongProperty> long convertToLong(EnumSet<T> es) { 
    long a = 0; 
    for (T sth : es) 
     a += sth.someLongProperty(); 
    return a; 
} 
+0

convertToLong可以以某種方式成爲HasSomeLongProperty(超類)的一部分,因此,如果他們想要,枚舉的某些變體可以覆蓋它呢? – Blankman 2012-02-01 03:04:45

+0

不幸的是,枚舉不能'擴展'任何東西,它們只能'實現'。除了一些限制之外,枚舉就像任何其他類一樣,所以你可以[委託](http://en.wikipedia.org/wiki/Delegation_pattern)給其他類。您也可以使用匿名樣式 - 請參閱我編輯的答案,以查看example.comments只能編輯5分鐘(點擊此框取消) – Bohemian 2012-02-01 05:25:33

0

沒錯 - Java的交集類型(波西米亞的答案),做你想做的。我有一個類似的問題,我有一些枚舉類,我都希望有一個getDescription()方法。

一般來說,交集類型會解決您無法繼承枚舉類型的問題。

相關問題