Java泛型:参数化泛型类型

时间:2012-06-13 10:45:49

标签: java templates generics

早上好,我正在研究一些java代码,我想做出类似的东西:

public class MyClass <E, T extends MyInterface<T<E>>> { } 

通过这种方式,T应该是实现MyInterface的类的泛型和实例,并且应该是E类型的参数。但是它似乎不可能在Java中,或者我的方法可能是错误的。提前谢谢。

更新

首先感谢所有回复的人,现在只是为了让事情变得清晰,让你明白我想要实现的目标,我想制作一个通用TDA的通用容器。 所以假设我们需要一个基于Integers的Stacks容器,然后我需要编写类似的东西:MyContainer,当然我需要为插入部分保留类型,否则我可以编写MyContainer&gt;。此外,由于我的所有TDA都实现了MyInterface,我想将其设置为绑定。 所以我想

public class MyContainer < E, T extends MyInterface < E>> 
应该做的伎俩。

4 个答案:

答案 0 :(得分:1)

这没有意义。

public class MyClass <E, T extends MyInterface<T<E>>> { } 

因为最右边的T.你为什么要自己参数化一个类?我认为你的真正含义是:

public MyClass<E, T extends MyInterface<E>>

这实际上意味着对于每个MyClass,您需要一个E和一个T MyInterface实例,该实例又被参数化以与E一起使用。

我发现初学者可能会厌倦了泛型,这会导致代码完全不可读。谨慎使用泛型,并考虑在每个给定的实例中是否真的需要它们。如果您发现自己编写的代码具有多级嵌套泛型参数化,那么您可能在设计方面做错了。

答案 1 :(得分:1)

基本上你正在尝试做这样的事情:

class MyClass<T<E>> // T has to be a generic class

或者这个:

class MyClass<T<Integer>> // T has to be a generic with Integer as parameter

你不能也不应该这样做,因为它没有任何意义。它没有告诉你关于T的任何有用的东西。你可以使用任何类作为T:

DummyClass<T> extends Anything {};
MyClass<DummyClass<Integer>> myClass;

答案 2 :(得分:0)

似乎应该是

public class MyClass <E, T extends MyInterface<E>> { } 

拥有public class MyClass <E, T extends MyInterface<T<E>>> { }

表示T

应该是MyInterface<MyInterface<E>>,这似乎不太可能。

编辑:

因此,如果您需要MyInterface<Class1<Class2>>,它似乎应该是这样的:

public class MyClass <A, B extends SomeClass<A>, C extends MyInterface<B> { }

public class MyClass <E, T extends MyInterface<SomeOtherClass<E>>> { }

答案 3 :(得分:0)

我不确定这是不是你想要的,但我认为它可能只是

MyClass<E, T extends MyInterface<E>>

T<E>对我没有多大意义。