簡體   English   中英

如何在接口中使用靜態方法返回實例方法返回的通用實例?

[英]How can I use a static method in an interface to return a generic instance returned by an instance method?

抱歉,標題措詞不便。 我現在很想念單詞。 :)

我有一堆來自數據存儲區的不同實體,它們在運行時通過搜索鏈接在一起。 當我需要檢索其中一個時,我具有類或類名,並且具有查找所需的搜索文本。

我希望能夠聲明如何在其自己的類中搜索每個對象的詳細信息,但是如果請求搜索的代碼不知道實際類型(即Foo.class),則它將調用靜態方法來處理搜索設置。 現在,我必須強制發布和禁止顯示警告,並且認為不需要這樣做。 我是否缺少簡單的東西?

public interface RetrievableBySearch<E extends RetrievableBySearch> extends Retrievable {
  E searchForEntity(String searchKey);

  @SuppressWarnings("unchecked")
  static <E extends RetrievableBySearch> E getEntityBySearch(Class<E> entityClass, String searchKey) {
    try {
      return (E) entityClass.newInstance().searchForEntity(searchKey);
    } catch (ReflectiveOperationException e) {
      throw new IllegalArgumentException("Unable to instantiate entityClass", e);
    }
  }
}

public class Foo implements RetrievableBySearch<Foo> {
  @Override public Foo searchForEntity(String searchKey) {
    // Do a search...
    return new Foo();
  }
}

// Elsewhere, someone has a reference to a Class<Foo>
Retrievable thing = RetrievableBySearch.getEntityBySearch(getClassForThing(), "Find this");

您正在使用RetrievableBySearch作為原始類型。 如果只提供類型參數,則不需要強制轉換:

interface RetrievableBySearch<E extends RetrievableBySearch<E>> {
    E searchForEntity(String searchKey);

    static <E extends RetrievableBySearch<E>> E getEntityBySearch(Class<E> entityClass,
            String searchKey) {
        try {
            return entityClass.newInstance().searchForEntity(searchKey);
        } catch (ReflectiveOperationException e) {
            throw new IllegalArgumentException("Unable to instantiate entityClass", e);
        }
    }
}

首先,針對您的問題,如果在兩個地方都將<E extended RetrievableBySearch>替換為<E extended RetrievableBySearch <E>>,則可以避免未經檢查的警告和強制轉換。

就是說,我應該指出此類的語義非常混亂。 searchForEntity方法建議將該接口命名為“ Searcher”,而不是“ RetreivableBySearch”。 “ RetreivableBySearch”聽起來根本不像接口名稱,因為這意味着存在其他類必須滿足的與搜索相關的約定。 如果您希望能夠通過其類名和searchKey查找對象,建議您創建一個類名/ searchKey元組的映射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM