通用接口扩展?

时间:2017-07-06 15:33:02

标签: java eclipse generics interface

嗨我在Generic界面上有这个问题,如果有人能够详细解释我的答案,我将非常感激。

接口我

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

界面J

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 个答案:

答案 0 :(得分: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) {

    }
}

答案 1 :(得分:1)

原因是J <T extends I<T>>,所以当你实现这个接口时,你需要为它提供扩展I的类T.但你不能像这样A<T> implements J<T extends I<T>>来编写它。我想这不是你想要的,因为它为T类创造了不必要的要求。

所以我要改变的是:

首先:J <T extends I<T>>更改为J<T> extends I<T>。现在你有更简单的J类型。我认为这是你需要/想要的。

第二:你应该实现所有方法,fi(T x)和fj(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