首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java泛型编程问题

java泛型编程问题
EN

Stack Overflow用户
提问于 2011-09-09 15:51:10
回答 2查看 268关注 0票数 1

我有这样一个A班:

代码语言:javascript
运行
复制
public class A<T extends Number>
{
 ....
}

在另一个类中,我有这样的方法:

代码语言:javascript
运行
复制
public Hashtable<String, A> createAHashtable()
    {
        Hashtable<String, A> hTable = new Hashtable<String, A>();

        return hTable;
    }

参数A有一个警告,因为它是泛型类。所以我应该这么做:

代码语言:javascript
运行
复制
public Hashtable<String, A <?>> createAHashtable()
        {
            Hashtable<String, A<?>> hTable = new Hashtable<String, A<?>>();

            return hTable;
        }

或者这样做:

代码语言:javascript
运行
复制
public Hashtable<String, A <? extends Number>> createAHashtable()
{
Hashtable<String, A<? extends Number> hTable = new Hashtable<String, A<? extends Number>();

return hTable;
}

或者…?

编辑:

尝试过这个(如Dilum的建议)

代码语言:javascript
运行
复制
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;
    }

但是“放”我的浮标A是无效的。

也许通配符是最好的选择。

编辑2:

根据Dilum的建议,以下代码(将浮点数A放入Hashtable时转换为A)没有错误,但警告它是不安全的强制转换。为什么我们需要演员?

代码语言:javascript
运行
复制
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;
        }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-09 15:59:06

试试这个:

代码语言:javascript
运行
复制
public <T extends Number> Hashtable<String, A<T>> createAHashtable() {
  return new Hashtable<String, A<T>>();
}

假设您确实想用键值对预填充,请尝试:

代码语言:javascript
运行
复制
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;
}
票数 5
EN

Stack Overflow用户

发布于 2011-09-09 17:54:31

与编辑2有关:

这里有一个具体的例子,说明为什么这个案子不安全。实际上,在我的IDE中,我甚至没有收到关于转换不安全的警告。

代码语言:javascript
运行
复制
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;
      }
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7364258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档