-4

インターフェイス zwave を拡張するジェネリック型を使用しているクラスがありますが、何らかの理由で zwave 変数にアクセスしようとすると、rm.keyword が「NullPointerException」を返します。クラスシーンにキャストすると機能しますが、それは私が望むものではありません

public <T extends zwave> T Find(List<T> Zwave,List<List<String>> listofinputstrings)
{
    for(List<String> lst: listofinputstrings)
    {
        for(String str: lst)
        {

            for (T rm: Zwave)
            {
    //*** problem is here
    //rm.keyword is always gives a NullPointerException unless i cast it to a class
               if (rm.keyword.equals( str.toLowerCase()))
               {
                   return  rm;
               }
            }

        }
    }


    return  null;
}

//ここにインターフェースがあります

 interface zwave
 {
    public String keyword="";
    public String zwaveID="";
 }

//ここにインターフェイスを実装するクラスがあります

public class Scene implements zwave
{
   String name;
   String keyword;
   String zwaveID;

    public Scene(String Name,String Keyword,String ZwaveID)
    {
        name= Name;
        zwaveID= ZwaveID;
        keyword = Keyword;
    }
}

編集

作業コード

//検索クラス

public <T extends searchable> T Find(List<T> searchableclasses, List<List<String>> listofinputstrings)
{
    for(List<String> lst: listofinputstrings)
    {
        for(String str: lst)
        {

            for (T searchable: searchableclasses)
            {

                for(String key: searchable.GetKeywords())
                {
                    if ( key.equals(str.toLowerCase()))
                    {
                        return searchable;
                    }
                }
            }

        }
    }


    return  null;
}

//抽象クラス

 abstract class searchable
 {
    String[]  keywords; //using array so i can use java's param ability
    public List<String> GetKeywords()
    {
        return new ArrayList(Arrays.asList(keywords));
    }
 }

//実際のクラス

public class Scene extends searchable
{
   String name;
   String zwaveID;

    public Scene(String Name,String ZwaveID,String... Keywords)
    {
        name= Name;
        zwaveID= ZwaveID;
        keywords = Keywords;
    }
}
4

3 に答える 3

1

getter メソッドを使用する必要があります。あなたが言うとき、それは空の文字列であるrm.keyword定数 ( ) を参照しています。zwave.keywordにキャストするSceneと、コンパイラはそれがフィールドであることを認識し、代わりに検索します。

一般に、特定の理由がない限りフィールドをnameandのように作成し、getter および setter メソッドを使用してそれらを操作する必要があります。keyword private

于 2013-08-25T04:50:27.313 に答える