私が達成しようとしていることは、特に私のような人のために説明するのはちょっと複雑ですが、基本的にはできるだけ説明しようとします。これをどうやってやりますか? Java継承
注:これは単なるプロトタイプであるため、カプセル化は心配しないでください。
私が達成したいのは、PersistenceDataクラスを拡張して、拡張されたクラスでより多くの情報を保持し、それに特有のPlayerManagerクラスに対応して使用するクラスを持つことです。そのコードでは、予期しないエラーが発生します。
Exception in thread "main" java.lang.ClassCastException: com.javatest.PersistenceData cannot be cast to com.javatest.PlayerData
私の質問は、どうすればこのようなことができますか?私はこのパターンが何と呼ばれているのかは分かりませんが、おそらくこれに代わるものがあります。ここで
は私のデータクラスの階層です:
public class PersistenceData
{
public String ID;
public String Name;
public PersistenceData(String id)
{
ID = id;
}
}
public class PlayerData extends PersistenceData
{
public int CharacterCount;
public PlayerData(String id)
{
super(id);
}
}
そして、ここでは、これらのデータを格納し、私のクラスである:
public abstract class Manager
{
protected final Map<String, PersistenceData> dataMap = new HashMap<>();
public void Load()
{
//Loading indefinite values from MYSQL here.
PersistenceData persistenceData = new PersistenceData("testid");
persistenceData.Name = "testname";
dataMap.put("testid", persistenceData);
}
public Map<String, PersistenceData> GetDataMap()
{
return dataMap;
}
public Map<String, PersistenceData> GetDataMapCopy()
{
return new HashMap<>(dataMap);
}
}
public class PlayerManager extends Manager
{
private static PlayerManager Instance;
public static PlayerManager GetInstance()
{
return Instance == null ? Instance = new PlayerManager() : Instance;
}
private PlayerManager()
{
}
@Override
public void Load()
{
super.Load();
PlayerData playerData = (PlayerData) dataMap.get("testid");
playerData.CharacterCount = 3;
System.out.println("ID: " + playerData.ID);
System.out.println("Name: " + playerData.Name);
System.out.println("Character Count: " + playerData.CharacterCount);
}
}
基本的にメインの質問は、私はインスタンス化しないか、ありますどのようなサブクラスがインスタンス化されるかを知らずにスーパークラスに基づいてサブクラス化する。私はジェネリックスを使用しようとしましたが、動作していないようです。あなたはスーパークラスのインスタンスにサブクラスのインスタンスをキャストすることはできませんが、あなたはこのような何か行うことができます
public abstract class Manager <T extends PersistenceData>
{
protected final Map<String, T> dataMap = new HashMap<>();
public void Load()
{
//Loading indefinite values from MYSQL here.
T persistenceData = new T("testid");
// T extends from PersistenceData. So it needs to have a constructor of atleast 1 argument.
persistenceData.Name = "testname";
dataMap.put("testid", persistenceData);
}
public Map<String, T> GetDataMap()
{
return dataMap;
}
public Map<String, T> GetDataMapCopy()
{
return new HashMap<>(dataMap);
}
}
ようこそ!私はあなたのコードに関連する部分を直接あなたの投稿に直接移動させました。これは、サイト外のコードがさまざまな理由でぶち壊されてしまうためです(他のサイトがダウンして、訪問者)。そうでなければ、問題と意図を明確に示すために、これはかなり良い質問でした。 – hexafraction