Java 与泛型混淆

标签 java generics

我无法找出使用泛型执行此操作的正确方法。我有课,Foo ,它有一个通用的( Foo<class> )。然后我想要一张 Map<String, Foo> 的 map 。现在,我可以这样做,并添加 Foo<String>作为一个 map 项,并且 Foo<Integer>作为另一个。但是,当我使用 map 的 get 方法时,我只得到 Foo返回并且类型不再能够推断,所以如果我这样做:

String s = map.get("StringFoo")

我收到编译错误,必须执行以下操作:

String s = (String) map.get("StringFoo")

做这样的事情以避免强制转换的好模式是什么,因为这就是泛型的首要用途。我也许可以做类似 Map<String, Foo<?>> 的事情,但这就是这样做的方法吗?

我的代码的详细信息如下,可以将其放入目录中并 javac *.java && java Main将运行它。

我在 Foo.java 中有一个通用的 java 类,

public class Foo<T>
{
    T value;

    public T getValue()
    {
        return this.value;
    }

    public void setValue(T t)
    {
        this.value = t;
    }
}

现在,我在 Main.java 中有以下测试类:

import java.util.Map;
import java.util.HashMap;

public class Main
{
    public static void main(String[] a)
        {
            Foo<String> fooStr = new Foo<String>();
            fooStr.setValue("TEST 123");

            Foo<Integer> fooInt = new Foo<Integer>();
            fooInt.setValue(314159);

            Map<String, Foo> mapOfFoo = new HashMap<String, Foo>();

            mapOfFoo.put("Strings", fooStr);
            mapOfFoo.put("Integer", fooInt);

            System.out.println("All set");

            String s = mapOfFoo.get("Strings").getValue();

            System.out.println("Got: " + s);

        }
}

当我编译这个时,我收到以下错误:

Main.java:21: error: incompatible types
            String s = mapOfFoo.get("Strings").getValue();
                                                       ^
  required: String
  found:    Object
1 error

当我在 Main.java 中执行此操作时,它有效:

import java.util.Map;
import java.util.HashMap;

public class Main
{
    public static void main(String[] a)
        {
            Foo<String> fooStr = new Foo<String>();
            fooStr.setValue("TEST 123");

            Foo<Integer> fooInt = new Foo<Integer>();
            fooInt.setValue(314159);

            Map<String, Foo> mapOfFoo = new HashMap<String, Foo>();

            mapOfFoo.put("Strings", fooStr);
            mapOfFoo.put("Integer", fooInt);

            System.out.println("All set");

            String s = (String)mapOfFoo.get("Strings").getValue();

            System.out.println("Got: " + s);

        }
}

我不确定对于这样的事情最好的做法是什么。有人有什么建议吗?

最佳答案

您似乎在 Map 声明和构造中使用了非泛型 Foo。相反,这个:

Map<String, Foo> mapOfFoo = new HashMap<String, Foo>();

应该是这样的:

Map<String, Foo<String>> mapOfFoo = new HashMap<String, Foo<String>>();

那么您就不必强制转换为 String ——这是首先使用泛型的原因之一,并且 Foo#getValue() 将明确返回一个 String。

关于Java 与泛型混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19613886/

相关文章:

java - 查询 Cloud Datastore 中的嵌入式实体

java - JDK8 中使用的 Rhino javascript JSR-223-wrapper 在哪里?

Java奇怪的ExceptionInInitializerError

java - 如何使用 Spring Boot 实现 Hashicorp 的 Vault

java 泛型 : bounded wildcard upsetting eclipse

c# - 在 ASP.Net Core 1.0 中注册通用 EntityFrameworkCore DbContext

java - 抽象基类的通用数据类型返回

java - Hibernate 和 Mysql 超时问题,不适用于 c3p0

java - Java 泛型中的铸铁保证是什么?

swift - 检查 Swift 通用数字是否高于其最大值的特定百分比