Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在列表元素中保留泛型_Java_Generics_Java 7_Generic List - Fatal编程技术网

Java 在列表元素中保留泛型

Java 在列表元素中保留泛型,java,generics,java-7,generic-list,Java,Generics,Java 7,Generic List,我有一个类依赖泛型在内部绑定类型 class C<T1, T2 extends T1> { T1 e1; T2 e2; /* stuff */ } C类{ T1-e1; t2e2; /*东西*/ } 在我的代码中,我知道,c.e1和c.e2可能没有相同的类,c.e2是c.e1类的一个子类的实例 我需要为这些cs创建一个列表,这些元素不会共享一个公共基类。尽管如此,我还是想保留这样一个事实,即列表中的每个元素都具有彼此之间的边界属性 理想情况下,我想创建一个

我有一个类依赖泛型在内部绑定类型

class C<T1, T2 extends T1> {
    T1 e1;
    T2 e2;
    /* stuff */
}
C类{
T1-e1;
t2e2;
/*东西*/
}
在我的代码中,我知道,
c.e1
c.e2
可能没有相同的类,
c.e2
c.e1
类的一个子类的实例

我需要为这些
c
s创建一个
列表
,这些元素不会共享一个公共基类。尽管如此,我还是想保留这样一个事实,即
列表中的每个元素都具有彼此之间的边界属性


理想情况下,我想创建一个
列表,因为
T2
C
的声明中是有界的,所以即使使用通配符,您也会始终保留它是
T1
的子类型这一事实。i、 e.第二个类型参数扩展第一个类型参数是
C
的一个特征。


因此,您只需使用
List我就可以找到一个解决方案,在自定义(非泛型)类型中对类型约束进行编码

现在我有了这些课程:

class MainLogic {
    List<TypeHelper<?,?>> elements = new ArrayList<>();
    <T1, T2 extends T1> void addElement(T1 e1, T2 e2) {
        this.elements.add(new TypeHelper<T1,T2>(e1, e2));
    }
    void logic() {
        for (TypeHelper<?, ?> element: elements)
            element.logicHelper(this);
    }
    <T1, T2 extends T1> void logicHelper(T1 e1, T2 e2) {
        // here finally I have the variables constrained
    }
}

class TypeHelper<T1, T2 extends T1> {
    T1 e1;
    T2 e2;
    void logicHelper(MainLogic ml) {
        ml.logicHelper(e1, e1);
    }
}
类主逻辑{

不幸的是列表元素不是均匀的;我的意思是我需要同时放置a
c1=newc()
c2=newc()
,但在
Iface1
Iface2
之间以及
Impl1
Impl2
之间没有基类。因此我不能有
列表,因为没有
T1
T2
开始with@VitoDeTullio这只是一个例子,重点是你可以使用
list问题i如果我使用
List@VitoDeTullio也许我误解了你的问题。如果你能提供更多关于如何使用列表的示例,这会有所帮助……但是如果你根本不想丢失类型,你可以使用2个列表,1是
列表问题是我有一个(潜在的)类型的数量不确定。目前有7个接口和10个实现。为每个组合提供一个列表本身并不符合列表的目的,但是您不需要
logicHelper
TypeHelper
中,您只需调用
this.logicHelper(element.e1,element.e2)
并且它是有效的。请看这里:如果
TypeHelper
在这里是
C
,那么
e1
的类型将始终扩展
e2
的类型。
public static <T1, T2 extends T1> void m(List<C<T1, T2>> list) {...}
public static <T1> void m(List<C<T1, ? extends T1>> list) {...}
class MainLogic {
    List<TypeHelper<?,?>> elements = new ArrayList<>();
    <T1, T2 extends T1> void addElement(T1 e1, T2 e2) {
        this.elements.add(new TypeHelper<T1,T2>(e1, e2));
    }
    void logic() {
        for (TypeHelper<?, ?> element: elements)
            element.logicHelper(this);
    }
    <T1, T2 extends T1> void logicHelper(T1 e1, T2 e2) {
        // here finally I have the variables constrained
    }
}

class TypeHelper<T1, T2 extends T1> {
    T1 e1;
    T2 e2;
    void logicHelper(MainLogic ml) {
        ml.logicHelper(e1, e1);
    }
}