2012-12-09 54 views
6
implements GenericObserver<DataService, Tools>, GenericObserver<MobileService, Tools> 

無法實施多次使用不同的參數。接口XXX無法實施多次使用不同的參數:

這是我的接口:

public interface GenericObserver<S, D> { 

    void update(S sender, D data); 
} 

我能做些什麼?我需要DataServiceMobileService

我嘗試使用通用T而不是DataServiceMobileService但我得到一個錯誤,T不存在。

+0

可能重複的[接口我不能超過一次使用不同的參數來實現多個:I 和我](http://stackoverflow.com/questions/9376059/interface-i-cannot-be-implemented -more-once-with-different-arguments-istr) –

+0

它不是一個字符串。它是類而不是字符串... – senzacionale

+0

@AdamMatan:這個特定的問題看起來更多地是關於Eclipse的Java 1.7編譯器的一個特定的怪癖(即bug),而不是關於實現通用接口的兩個實例的問題的一般問題。肯定有關於這個的問題,但那不是其中之一。 –

回答

7

一種可能性:

abstract class Service {} 

class DataService extends Service {} 

class MobileService extends Service {} 

class Foo implements GenericObserver<Service, Tools> { 
    void update(Service sender, Tools data) { 
     if (sender instanceOf DataService) { 
      // do something 
     } else if (sender instanceOf MobileService) { 
      // do something else 
     } else { 
      // throw some notImplemented exception 
     } 
    } 
} 

Visitor pattern是另一種可能性(GenericObserver作爲的Visitable)。

+0

謝謝你的好主意。我會嘗試。 – senzacionale

13

這是因爲Java在做type erasure。編譯後,所有通用類型都被擦除,兩個接口在字節碼中看起來都是一樣的。

+0

謝謝你的好解釋 – senzacionale

1

我看到你爲什麼要做這兩種可能的情況:

這第一個 - 無論GenericObserver和GenericObserver是實現類接口是必不可少的。在這種情況下,你可能有一個設計缺陷,因爲對象應儘可能專業化(即最好有兩個不同的類,每個類專注於專門的任務,而不是一個類混合兩個類)。所以你可能應該創建兩個獨立的類,一個實現GenericObserver,另一個實現GenericObserver。當你嘗試用不同的類型參數實現GenericObserver兩次時,編譯器會抱怨,因爲Java中的泛型是使用擦除來實現的,因此GenericObserver和GenericObserver在運行時基本上是相同的GenericObserver。

第二種情況 - 這些接口是實現細節的一部分。然後你可以使用內部類(或靜態嵌套類)來實現你的目標。例如:

public class OuterClass { 

    private String hello = "Hello"; 
    private String world = "World"; 

    private class InnerClass1 implements GenericObserver<DataService, Tools> { 
     public String interfaceMethod() { 
      return hello + " " + world; 
     } 
     // more implementation 
    } 

    private class InnerClass2 implements GenericObserver<MobileService, Tools> { 
     // implementation 
    } 

} 

如果使用內部類,那麼你可以輕鬆地訪問包含類,你可以從這個有點做作例子中看到的領域。

2

實現類可以提供這些接口作爲能力提供查找方法如下。這種模式的優點是類的API的可擴展性和解耦。

interface DataObserver extends GenericObserver<DataService, Tools> { } 

interface MobileObserver extends GenericObserver<MobileService, Tools> { } 

public class Implementor { 

    private DataObserver dataObserver; 
    private MobileObserver mobileObserver; 

    public <T> T lookup(Class<T> klazz) { 
     ... return dataObserver; 
    } 

}