简体   繁体   English

Java泛型限制类型

[英]Java Generics limit type

In Java i have the following Class Structure: 在Java中,我有以下类结构:

class All 全部
+-- class A extends All + - A类扩展全部
+-- class B extends All + - B级扩展All

class ContainAll class ContainAll
+-- class ContainA extends ContainAll + - 类ContainA扩展ContainAll
+-- class ContainB extends ContainAll + - 类ContainB扩展ContainAll

In every "contain" class there is a linked list, and a Method 在每个“包含”类中都有一个链表和一个方法

public addElement(All a) {
    list.add(a)
}

The class ContainAll should not be instanced, but the class ContainA and ContainB can. ContainAll类不应该是实例化的,但是ContainA和ContainB类可以。
How do i make clear, with generics, that addElement in class ContainB can only get Objects from type B, so for Example: 我如何使用泛型清楚地表明,ContainB类中的addElement只能从类型B获取对象,因此对于示例:

public abstract class ContainAll<T extends All> {}

public class ContainB<T extends B> extends ContainAll<All> {
    public addElement(T b) {
        list.add(b);
    }
}

But this example does not work, i tried it. 但这个例子不起作用,我试了一下。 Thanks for reading. 谢谢阅读。

Make your ContainAll class abstract (since one of your requirements is to not be able to instantiate it) and make it implement .addElement() : 使您的ContainAll类成为抽象(因为您的一个要求是无法实例化它)并使其实现.addElement()

public abstract class ContainAll<T extends All>
{
    private final List<T> list = new LinkedList<T>();

    // ...

    // FINAL! Subclasses cannot override it
    public final void addElement(final T element)
    {
        list.add(element);
    }
}

Then implement ContainA as ContainAll<A> etc. The .addElement() will work "automatically". 然后实现ContainA作为ContainAll<A>.addElement()会工作“自动”。

You need to add 你需要添加

public addElement(T b) {
    list.add(b);
}

to your ContainAll class. 到你的ContainAll类。

Here is a solution: 这是一个解决方案:

//ClassA // ClassA的

package limitgeneric;

public class A {

}

//ClassB // ClassB的

package limitgeneric;

public class B {

}

//Class ContainAll // Class ContainAll

package limitgeneric;

public abstract class ContainAll<T> {
     public abstract void addElement(T t);
}

//Class ContainA // Class ContainA

package limitgeneric;

import java.util.ArrayList;
import java.util.List;

public class ContainA<T extends A> extends ContainAll<T> {
     List<T> locallist = new ArrayList<T>();
     public void addElement(T t) {
          locallist.add(t);
     }
}

//Class ContainB // Class ContainB

  package limitgeneric;

  import java.util.ArrayList;
  import java.util.List;

  public class ContainB<T extends B> extends ContainAll<T> {
    List<T> locallist = new ArrayList<T>();
    public void addElement(T t) {
        locallist.add(t);
    }
  }

//Main class //主要课程

  package limitgeneric;

  public class Main {
      public static void main(String[] args) {
          ContainA<A> a = new ContainA<A>();
          //a.addElement(new B());
          a.addElement(new A());
          //ContainA<B> b = new ContainA<B>();
      }
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM