簡體   English   中英

一個Java通用編程問題

[英]a java generic programming question

我有這樣的A類:

public class A<T extends Number>
{
 ....
}

在另一個類中,我有此方法:

public Hashtable<String, A> createAHashtable()
    {
        Hashtable<String, A> hTable = new Hashtable<String, A>();

        return hTable;
    }

由於參數A是通用類,因此存在警告。 所以我應該這樣做:

public Hashtable<String, A <?>> createAHashtable()
        {
            Hashtable<String, A<?>> hTable = new Hashtable<String, A<?>>();

            return hTable;
        }

或執行以下操作:

public Hashtable<String, A <? extends Number>> createAHashtable()
{
Hashtable<String, A<? extends Number> hTable = new Hashtable<String, A<? extends Number>();

return hTable;
}

要么 ....???

編輯:

嘗試過這一點(如Dilum所建議)

public <T extends Number> Hashtable<String, A<T>> createAHashtable()
    {
        Hashtable<String, A<T>> hTable = 
                new Hashtable<String, A<T>>();
        A<Float> constraint = new A<Float>();
        hTable.put("test", constraint);

        return hTable;
    }

但是“放入”我的Float A是無效的。

也許通配符是解決之道。

編輯2:

根據Dilum的建議,以下代碼(將Float A放入哈希表時投射到A)沒有錯誤,但警告它是不安全的轉換。 為什么我們需要演員?

public <T extends Number> Hashtable<String, A<T>> createAHashtable()
        {
            Hashtable<String, A<T>> hTable = 
                    new Hashtable<String, A<T>>();
            A<Float> constraint = new A<Float>();
            hTable.put("test", (A<T>)constraint);

            return hTable;
        }

嘗試這個:

public <T extends Number> Hashtable<String, A<T>> createAHashtable() {
  return new Hashtable<String, A<T>>();
}

假設您確實要預填充鍵值對,請嘗試:

public <T extends Number> Hashtable<String, A<T>> createAHashtableWithEntry(String key, T value) {
  Hashtable<String, A<T>> ht = return new Hashtable<String, A<T>>();
  ht.put(key, new A<T>(value));
  return ht;
}

與編輯2相關:

這是案件不安全的具體示例。 實際上,在我的IDE上,我什至沒有收到有關強制轉換不安全的警告。

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

public class Genericss {

   static <T extends Number> List<A<T>> get2() {
      List<A<T>> list = new ArrayList<A<T>>();
      A<Float> f = new A<Float>(3.0f);
      list.add((A<T>) f); // Compiles... not even a warning on my IDE
      return list;
   }

   public static void main(String[] args) {
      List<A<Integer>> l = Genericss.<Integer>get2();
      Integer i = l.get(0).get(); // runtime error

      A<Float> f = new A<Float>(3f);
      //i = (A<Integer>) f;  // won't compile
   }

   public static class A<T> {
      T t;

      public A(T t) {
         this.t = t;
      }

      public T get() {
         return t;
      }
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM