我正在嘗試用具體型別實作一個通用介面,但是 java 編譯器迫使我將它實體化為原始型別。這是我的代碼的模型:
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("thing", "extra");
Worker<String, String> worker = new Worker<>();
worker.execute(map);
}
public class Worker<K, V> {
public void execute(Map<K, V> map) {
IDao<K, V> dao = new Dao();
dao.doThing(map);
}
}
public interface IDao<K, V> {
void doThing(Map<K, V> map);
}
public class Dao implements IDao<String, String> {
public void doThing(Map<String, String> map) {
for (Map.Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String newKey = key.toUpperCase();
System.out.println(newKey " " entry.getValue());
}
}
}
如果我更改IDao<K, V> dao = new Dao();為,此代碼將按預期作業IDao dao = new Dao(),但這不是好的做法,我想避免它。我不明白為什么像這樣在實體化時宣告型別是非法的。
uj5u.com熱心網友回復:
這...
public class Worker<K, V> {
public void execute(Map<K, V> map) {
IDao<K, V> dao = new Dao();
dao.doThing(map);
}
}
對我來說似乎錯了。
該類Worker允許為. Map_ 這似乎是對合同的基本違反。Dao<String, String>
就個人而言,我可能會改變它,以便將實體IDao注入工人,例如......
public static class Worker<K, V> {
private IDao<K, V> dao;
public Worker(IDao<K, V> dao) {
this.dao = dao;
}
public void execute(Map<K, V> map) {
dao.doThing(map);
}
}
nb:這可能是一個abstract工廠,它有一個abstract類似的方法abstract protected IDao<K, V> getDao();,然后你必須提供某種具體的實作來支持它,但它基本上歸結為同一件事
然后你就可以簡單地稱它為......
Map<String, String> map = new HashMap<>();
map.put("thing", "extra");
Worker<String, String> worker = new Worker<>(new Dao());
worker.execute(map);
當然,如果您不想這樣做,那么您必須洗掉通用約束Worker并要求任何呼叫者將其傳遞給Map約束<String, String>
public static class Worker {
public void execute(Map<String, String> map) {
IDao<String, String> dao = new Dao();
dao.doThing(map);
}
}
但是現在,好處在哪里?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/426091.html
