3

这是一个现有的接口:

public interface MyInterface<T, U> {
    public T foo(U u);
}

我想在假设 T 和 U 是同一类型的情况下实现这个接口。我想也许我可以将类型参数保持原样,然后只要我只用两个相同类型的实例实例化这个特定的实现,它就可以工作:

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 以指定其类型始终相同MyClass<A, A> implements MyInterface<A, A>,但是我收到错误说 T 已经定义。

有没有办法实现 MyClass 以使其两种类型相同?

(比起 Java,我更像是一个 C++ 人,如果我在这里遗漏了一些关于 Java 泛型的基本知识,很抱歉。)

4

2 回答 2

2

您的 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类的具体类型

由于在类的主体内部T并且U是无界类型变量(即对实际类型一无所知),因此假定它们是不兼容的。

通过在您中只有一个类型变量,您MyClass可以明确假设:只有一个类型,我将它用于两种类型的接口。

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

于 2013-04-08T16:34:22.833 回答
1

为 定义单个类型参数MyClass

class MyOuterClass<A> {

    public class MyClass<T> implements MyInterface<T, T> {

        public T foo(T u) {
            return u;
        }
    }

    // Need only one 'A' here.
    private MyClass<A> myInstance = new MyClass<A>();

}

当你说

public class MyClass<T> implements MyInterface<T, T> {

...您正在定义一个通用变量 forMyClass并且您说它同时满足角色TUin MyInterface

于 2013-04-08T16:34:36.987 回答