2011-05-09 132 views
0

假設我們有一個接口,這樣...Java泛型與多類型支持

interface ICalculator<T extends CalculableObject>{ void calculate(T obj); }

在那裏我們泛型類型是一個抽象類...

public abstract class CalculableObject{...}

多具體類型...

public class TypeA extends CalculableObject{...}

public class TypeB extends CalculableObject{...}

你將如何去定義Calculator對象的實現,該對象需要爲多個CalculableObject類型定義計算方法?

即 -

public CalculatorAB<?> implements ICalculator{
void calculate(TypeA obj){...}
void calculate(TypeB obj){...}
}

回答

2

因爲類型擦除,你不能。請參閱:Getting error for generic interface: The interface Observer cannot be implemented more than once with different arguments:

我會做的是使用一個檔案,並有你的計算器,但它根本沒有實現ICalculator,或更好的是,有CalculatorAB實現ICalcuator。然後,您的方法可以檢查實例並轉發到適當的方法。

public CalculatorAB implements ICalculator<CalculableObject> { 
    void calculate(CalculableObject obj){ 
    if(obj instanceof TypeA) 
     calculate((TypeA)obj); 
    else if(obj instanceof TypeB) 
     calculate((TypeB)obj); 
    } 
    void calculate(TypeA obj){...} 
    void calculate(TypeB obj){...} 
} 
0

使用enum

public enum Type extends CalculableObject { 
    A 
    { 
     @Override 
     public void doSomething() { } 
    }, 
    B; 
} 

然後你保證TypeAB存在,它們都延長CalculableObject

此,您還可以簡單地在Type.A傳遞給calculate方法作爲TypeCalculableObject,而不是與A,B,C,d塞滿它等

-1

可以定義你需要的方法在CalculableObject類中「計算」。然後,在CalculatorAB中,您只需調用給定對象上的那些方法。

0

我敢說,如果你想這樣做,也許在你的設計的其他地方出現了問題。但除了已經提到的替代方案之外,您可以在接口中使計算方法變爲通用,而不是整個接口。然後,子接口可以是通用的,或者簡單地定義你想要的新方法。

像這樣:

public static abstract class CalculableObject{} 

public static class TypeA extends CalculableObject{} 
public static class TypeB extends CalculableObject{} 
public static class TypeC extends CalculableObject{} 

public interface ICalculator{ 
    <T extends CalculableObject> void calculate(T obj); 
} 

public static class CalculatorAB implements ICalculator{ 

    void calculate(TypeA obj){ 
     System.out.println("TypeA"); 
    } 
    void calculate(TypeB obj){ 
     System.out.println("TypeB"); 
    } 

    @Override 
    public <T extends CalculableObject> void calculate(T obj) { 
     System.out.println("CalculableObject"); 
    } 
} 

public static void main(String args[]){ 
    TypeA a = new TypeA(); 
    TypeB b = new TypeB(); 
    TypeC c = new TypeC(); 

    CalculatorAB ab = new CalculatorAB(); 

    ab.calculate(a); 
    ab.calculate(b); 
    ab.calculate(c); 
} 

這使得

TypeA 
TypeB 
CalculableObject 
1

你不能。 (流行的看法相反,它可以相對容易地不運行時具體化來實現。但事實並非如此。)

「主」類型的一般多亞型是一個壞主意。有有一個返回適當Calculator小號的方法之一對象(無匈牙利請!)。