这是一个现有的接口(interface):
public interface MyInterface<T, U> {
public T foo(U u);
}
我想在 T 和 U 是同一类型的假设下实现这个接口(interface)。我想也许我可以保留类型参数,然后只要我只用两个相同类型的实例实例化这个特定的实现,它就可以工作:
public class MyOuterClass<A> {
public class MyClass<T, U> implements MyInterface<T, U> {
@Override
public T foo(U u) {
return u; //error here
}
//even though in the only instantiation of MyClass, T and U are the same
private MyClass<A, A> myInstance = new MyClass<A, A>();
}
但是,也许不足为奇,这不起作用,因为类型 T 和 U 不兼容。
然后我想也许我可以更改 MyClass 以指定其类型始终相同,方法是将其更改为类似 MyClass<A, A> implements MyInterface<A, A>
的类型。或类似的,但我收到错误提示 T 已定义。
有没有一种方法可以实现 MyClass,使其两种类型相同?
(我更喜欢 C++ 而不是 Java,如果我在这里遗漏了一些关于 Java 泛型的基础知识,我深表歉意。)
最佳答案
你的 myclass 需要看起来像这样:
public class MyClass<T> implements MyInterface<T, T> {
@Override
public T foo(T in) {
return in;
}
}
让我们回顾一下您建议的类定义的作用:
public class MyClass<T, U> implements MyInterface<T, U>
在此代码中,T
和 U
分别做两件事:
- 在第一次出现时,他们定义了一个类型变量
MyClass
类 - 在第二次出现时,他们指定了
MyInterface
的具体类型类
因为在你类(class)的 body 里面T
和 U
是无限类型变量(即对实际类型一无所知),它们被假定为不兼容。
在你的 MyClass
中只有一个类型变量你明确了你的假设:只有一种类型,我将它用于两种类型的接口(interface)。
最后但同样重要的是:请记住,一旦源代码被完全处理,类型的编译就完成。换句话说:与 C++ 的做法相反,泛型类型的“实例化”(C++ 中的“模板类型”或类似类型;抱歉我生疏的术语)不处理。 MyClass<Foo>
和 MyClass<Bar>
就 JVM 而言,它们是同一类型(只有编译器才真正区分它们)。
关于java - 一个接口(interface)有两个类型参数。我可以实现两种类型相同的接口(interface),以便它们兼容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15884325/