2017-07-06 184 views
-2

嗨我在通用接口上有這個問題,如果有人能夠以詳細的方式解釋我的答案不勝感激。通用接口擴展?

Inteface我

public interface I <T> { 
void f (T a); 
} 

接口Ĵ

public interface J <T extends I<T>>{ 
    void g(T b); 
} 

A類

public class A<T> implements J<T>{ 
    public void g(T b) { 

    } 
} 

A類中的代碼會給出錯誤。 你能向我解釋爲什麼它給出了一個錯誤?

A類FIX

public class A<T extends I<T>> implements J<T>{ 
    public void g(T b) { 

    } 
} 

可能有人向我解釋爲什麼這個代碼修正錯誤?

在此先感謝

回答

2

這是因爲你的T不會擴展/實現I<T>

使用相同的通用佔位符常常令人困惑。試着看它是這樣的:

public interface I<TI> { 
    void f(TI a); 
} 

public interface J<TJ extends I<TJ>> { 
    void g(TJ b); 
} 

// Error:(17, 37) java: type argument TA is not within bounds of type-variable TJ 
// i.e. This `TA` does NOT implement/extend J<TA extends I<TA>> 
public class A<TA> implements J<TA> { 
    public void g(TA b) { 

    } 
} 

// Works fine because `TB extends I<TB>` 
public class B<TB extends I<TB>> implements J<TB> { 
    public void g(TB b) { 

    } 
} 
0

的原因是J <T extends I<T>>,所以當你實現這個接口,你需要爲它提供一個擴展一類t,但你不能把它寫這樣A<T> implements J<T extends I<T>>。我猜想,這是不是你想要的,因爲它創造了T級不必要的要求

所以,我會改變的是:

第一:J <T extends I<T>>變化J<T> extends I<T>。現在你有更簡單的類型J.我認爲這就是你需要/想要的。第二:你應該實現所有的方法,fi(T x)和f j(T x),所以就這麼做。

這裏是工作示例它是如何完成的。簡單和工作。

public class MyClass { 

    public static void main(String[] args) throws Exception { 
     A a = new A<String>(); 
     a.fi("foo"); 
     a.fj("bar"); 
     return; 
    } 

    public interface I<T> { 
     void fi(T t); 
    } 

    public interface J<T> extends I<T> { 
     void fj(T t); 
    } 

    public static class A<T> implements J<T> { 
     // it is static only to be accessible from main() 
     public A() { 
      // default constructor 
     } 

     public void fi(T t) { 
      System.out.println("method from I, arg=" + b.toString()); 
     } 

     public void fj(T t) { 
      System.out.println("method from J, arg=" + b.toString()); 
     } 
    } 
} 

輸出:

method from I, arg=foo 
method from J, arg=bar