gpt4 book ai didi

java - 一个接口(interface)有两个类型参数。我可以实现两种类型相同的接口(interface),以便它们兼容吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:51 25 4
gpt4 key购买 nike

这是一个现有的接口(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>

在此代码中,TU分别做两件事:

  • 在第一次出现时,他们定义了一个类型变量 MyClass
  • 在第二次出现时,他们指定了 MyInterface 的具体类型类

因为在你类(class)的 body 里面TU是无限类型变量(即对实际类型一无所知),它们被假定为不兼容。

在你的 MyClass 中只有一个类型变量你明确了你的假设:只有一种类型,我将它用于两种类型的接口(interface)。

最后但同样重要的是:请记住,一旦源代码被完全处理,类型的编译就完成。换句话说:与 C++ 的做法相反,泛型类型的“实例化”(C++ 中的“模板类型”或类似类型;抱歉我生疏的术语)处理。 MyClass<Foo>MyClass<Bar>就 JVM 而言,它们是同一类型(只有编译器才真正区分它们)。

关于java - 一个接口(interface)有两个类型参数。我可以实现两种类型相同的接口(interface),以便它们兼容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15884325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com