一个接口有两个类型参数。我可以使用两种类型的接口来实现接口吗,这样它们就可以兼容了吗?

问题描述:

这是现有的接口:一个接口有两个类型参数。我可以使用两种类型的接口来实现接口吗,这样它们就可以兼容了吗?

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<A, A> implements MyInterface<A, A>或类似的东西,但我得到的错误说T已经定义。

有没有办法实现MyClass,使它的两种类型是相同的?

(我更多的是C++的家伙比Java的,很抱歉,如果我错过了Java的泛型东西在这里根本。)

+0

您正在使用两种不同类型的参数;编译器无法弄清楚你的意图,因为如果它们的目的是为相同的类型,你应该说'MyClass '而不是'MyClass '。 – 2013-04-08 16:34:27

你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

的自的主体内的类TU是无限类型变量(即没有关于实际类型的信息),它们被认为是不兼容的。

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

最后但并非最不重要:请记住一旦源完全处理,编译的类型为完成。换句话说:与C++相反,泛型类型的“实例化”(C++中的“模板类型”或类似;对于我生锈的术语抱歉)不是句柄。就JVM而言,MyClass<Foo>MyClass<Bar>是相同的类型(只有编译器实际上将它们区分开来)。

定义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> { 

...要定义MyClass一个通用的变量,你说的话,它可以同时满足TUMyInterface中的角色。