簡體   English   中英

Java泛型限制類型

[英]Java Generics limit type

在Java中,我有以下類結構:

全部
+ - A類擴展全部
+ - B級擴展All

class ContainAll
+ - 類ContainA擴展ContainAll
+ - 類ContainB擴展ContainAll

在每個“包含”類中都有一個鏈表和一個方法

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

ContainAll類不應該是實例化的,但是ContainA和ContainB類可以。
我如何使用泛型清楚地表明,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);
    }
}

但這個例子不起作用,我試了一下。 謝謝閱讀。

使您的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);
    }
}

然后實現ContainA作為ContainAll<A>.addElement()會工作“自動”。

你需要添加

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

到你的ContainAll類。

這是一個解決方案:

// ClassA的

package limitgeneric;

public class A {

}

// ClassB的

package limitgeneric;

public class B {

}

// Class ContainAll

package limitgeneric;

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

// 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

  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);
    }
  }

//主要課程

  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