嗨我在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) {
}
}
有人可以向我解释为什么这段代码会修复错误吗?
提前致谢
答案 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