Java 包含不同片段的HashMap(或ArrayList)
对于特定情况,我想制作一个Java 包含不同片段的HashMap(或ArrayList),java,android,android-fragments,hashmap,Java,Android,Android Fragments,Hashmap,对于特定情况,我想制作一个HashMap,其中键是片段,值是整数。然而,每个不同的片段都有不同的类型,而不仅仅是Fragment类型。因此,以下内容(我最初尝试的内容)不起作用: HashMap<Fragment, Integer> hmap = new HashMap<>(); hmap.put(new ExampleFragment(), 5); hmap.put(new AnotherFragment(), 2); HashMap hmap=newhashmap(
HashMap
,其中键是片段,值是整数。然而,每个不同的片段都有不同的类型,而不仅仅是Fragment
类型。因此,以下内容(我最初尝试的内容)不起作用:
HashMap<Fragment, Integer> hmap = new HashMap<>();
hmap.put(new ExampleFragment(), 5);
hmap.put(new AnotherFragment(), 2);
HashMap hmap=newhashmap();
put(新的ExampleFragment(),5);
放置(新的另一个片段(),2);
现在这当然行不通了,因为ExampleFragment
和AnotherFragment
不是要放入HashMap
的正确类型编辑:我在AndroidStudio中遇到以下错误:
错误的第一个参数类型。找到:“com.example.swarm.rpg.ExampleFragment”,必需:“android.app.Fragment”
现在我的问题是:如何在同一个HashMap
(或者ArrayList
)中存储Fragment
的不同子类,这可能吗
对于我的具体情况,我确实有一个变通方法,但它并不像这个方法那样整洁。所以我还是很好奇
编辑:我确实混淆了
Fragment
和android.support.v4.app.Fragment
,谢谢:)对于你的问题,它应该可以工作,就像这样,那么你是否可能混淆了“Fragment”类型?在典型的android名称空间中有几个(例如android.app.Fragment与android.support.v4.app.Fragment):
也许你应该使用HashMap-hmap,它不确定你为什么要实现它,但是你可以只做
HashMap
和hmap.put(“ExampleFragment”,5)代码>@nongthonbamthoi这确实是我的解决方法。但是,当从这个HashMap中选取一个随机片段时,这需要一些额外的逻辑,每个片段都有一个if语句(或switch case)。这感觉不太整洁,也使添加更多片段变得不友好。您可以存储子类,但是如果您的子类中有新方法,这些方法不会覆盖superFragment
类,您将无法使用它们,除非您显式向下转换,如果您不正确地施法,可能会导致ClassCastException
。这同样适用于FragmentManager::getFragmentbyId
——它只有一个内部映射
Hm,这很有趣。当我尝试这样做时,在Android Studio中会出现以下错误:'com.example.swarm.rpg.ExampleFragment',必选:'Android.app.Fragment'
。这可能是因为我的片段声明吗?是的,这以一种模糊的方式告诉我,您的“ExampleFragment”与HashMap声明中的类型不同。同样,小心不要只使用“Fragment”-因此在导入中验证您的完全限定名。(在我自己的测试中,我将ExampleFragment更改为“android.support.v4.app.Fragment”,其他内容保持不变,并复制与您提到的相同的错误-因此听起来好像您在混合片段引用。使用您想要的任何片段父类型;它们只需要是相同的父类型。我确实混合了Fragment
和android.support.v4.app.Fragment
,谢谢:)
import android.app.Fragment;
import android.util.Log;
import java.util.HashMap;
public class TestHashMap {
private HashMap<Fragment, Integer> test = new HashMap<>();
public static class ExampleFragment extends Fragment {
public ExampleFragment() { super(); }
public String toString() { return "ExampleFragment[hash:"+hashCode()+"]"; }
public void someOtherMethod() {}
}
public static class AnotherFragment extends Fragment {
public AnotherFragment() { super(); }
public String toString() { return "AnotherFragment[hash:"+hashCode()+"]"; }
}
public void test() {
test.put(new ExampleFragment(),1);
test.put(new AnotherFragment(),2);
Log.d("TestHashMap","size = "+test.size());
Log.d("TestHashMap",test.toString());
}
}
D/TestHashMap: size = 2
D/TestHashMap: {AnotherFragment[hash:230309272]=2, ExampleFragment[hash:5536635]=1}