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

标签 java generics inheritance types

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

相关文章:

java - 在 Windows 上验证文件名

java - 使用类型输入创建对象

c++ - 应该在所有继承级别或仅在祖先级别声明函数虚拟?

java - 将 hibernate 与泛型一起使用

java - 子类构造函数是否从父类(super class)构造函数继承变量?

sms - 将 SMS 从文本转换为 PDU 格式 Java

java - Spinner OnItemSelected 事件未被调用

java - 添加了 JButton,但运行时不可见

scala - Shapeless 在通用上下文中不起作用

TypeScript:返回扩展 Record<string, string> 的通用类型的函数