【问题标题】:How to define a Map with 'T' [duplicate]如何用'T'定义地图[重复]
【发布时间】:2021-03-30 15:29:28
【问题描述】:

我可以用'?'来定义它:

private static final Map<Class<? extends SuperClass>, String> map=
new HashMap<Class<? extends SuperClass>, String>() {

    private static final long serialVersionUID = 913392463302576279L;

    {
        put(SubClaas1.class, "sub1");
        put(SubClaas2.class, "sub2");
    }
};

但是用T定义,编译报错:

private static <T extends SuperClass> Map<Class<T>, String> map = new HashMap<>();

如何定义它使用'T'模式。

【问题讨论】:

  • T 应该是什么,谁/什么赋予了T 的价值?如果要使用T,则需要将其声明为封装类的泛型类型参数。
  • 是什么让您认为您想要或需要带有命名类型参数的表单(在您的问题中命名为T)?
  • @OleV.V.很抱歉让你感到困惑。我只是觉得“T”型比“?”更通用类型。
  • 现在我明白你为什么问了。我当然认为带有&lt;?&gt; 的表单至少是通用的。所以我的建议是你接受它。

标签: java


【解决方案1】:

Java 不支持为单个字段声明类型参数,只支持类或方法。

您要么需要将 T 的声明移动到周围的类本身中,要么继续使用 Class&lt;? extends SuperClass&gt; 并对任何适当的类型进行未经检查的强制转换。

编辑:抱歉,我刚刚注意到该字段是静态的,在这种情况下,您不能只将类型参数移动到类中。您需要直接使用Class&lt;? extends SuperClass&gt;,或者通过将类型不安全封装在一些自定义类映射中。

【讨论】:

    【解决方案2】:

    泛型类型是通过类型参数化的泛型类或接口。 它可以用于类或方法,但不能用于字段。

    如果你想用'T'定义一个地图: 一个。使用方法:

    private static <T extends SuperClass> HashMap<T, String> generateMap() {}
    

    b.使用方法:

    class Foo<T extends SuperClass> {
        private HashMap<Class<T>, String> map = new HashMap<Class<T>, String>();
    }
    

    【讨论】:

    • 关于a.method,当我在'generateMap()' 'map.put(SubClass.class,"sub");//错误'中添加行时仍然会出现编译错误
    • @SeaSwordWithWindShadow 我更新了答案。在返回类型中删除了 'Class'。它应该可以工作。
    【解决方案3】:

    可以根据方法调用者的需要获取一个类型的map,例如:

       public static <T extends SuperClass> HashMap<T, String> giveMeMap() {
            return new HashMap<T, String>();
        }
    

    那么这将符合:

    private static HashMap<SuperClass, String> map = giveMeMap();
    

    但这不是,因为&lt;T extends SuperClass&gt;方法的类型限制

    private static HashMap<String, String> map2 = giveMeMap();
    

    这是在回答你的问题吗?

    【讨论】:

    • 我需要返回一个静态 HashMap,字符串>。并用 'put(SubClass1.class,'sub1'); 初始化它将 (SubClass2.class, 'sub2')' 放入函数 giveMeMap() 主体中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多