0

List listofintegerタイプIntegerですが、文字列オブジェクトを受け入れます。私がチェックするとinstance of Integer、 true が返されます。あまりにも奇妙です。何が起こっているのか誰でも説明できます。

私が知っているのは、List listofintegerto メソッドを送信すると、タイプのない List 参照変数への参照が与えられることです。追加すると、入力を String として受け取りList listofanythingますList of Integer type

今、私はチェックしますinstanceof、それは印刷trueしていますIntegerが、そのString

import java.util.ArrayList;
import java.util.List;

public class TestEx {

     List<Integer> listofinteger=new ArrayList<Integer>();      //list of integer type
     public static void main(String... args)
     {

         TestEx f=new TestEx();
         f.listofinteger.add(123);              //adds integer by wrapping it(auto)

         f.listofinteger=f.addelement(f.listofinteger);

         if(f.listofinteger.get(1) instanceof Integer);
         {
             System.out.println("true");                   //prints true here
             System.out.println(f.listofinteger.get(1));
         }



     }
      List<Integer> addelement(List listofanything)
     {
          listofanything.add("asdasdasd");            //adding String object

        return listofanything;
     }
}    

ここのメソッドaddelement(List listofanything )には整数型を指定する必要があることはわかっていますが、ジェネリックの概念を理解するためにここでテストしています

4

3 に答える 3

5

まず、@VJD がコメントしたように、構文エラーがあります - 不要;です:

if(f.listofinteger.get(1) instanceof Integer);

あなたの質問について、ジェネリックは型の安全性をチェックするためのコンパイル時のツールです。実行時には、タイプ erasureの検証はありません。そのため、 ..Stringのリストに追加してもエラーは発生しません。Integers

于 2013-06-03T07:43:04.277 に答える
1

コードの構文エラーが原因で、プログラムが出力trueされます。これは、意図したものとは異なる意味で合法です。

あなたのif発言は

  if(f.listofinteger.get(1) instanceof Integer);

最後のセミコロンはステートメント全体を終了し、空のブロックを渡すことと同等にします:

  if(f.listofinteger.get(1) instanceof Integer) {
    // Do nothing
  }

その後、if 条件の一部であるはずのブロックがありましたが、現在は単なる匿名ブロックになっています。(範囲指定の目的でステートメントを区切るために、コード内の任意の場所に中かっこを多かれ少なかれ追加できます。これらは標準の順序で実行されます)。

両方をまとめると、コードは次のようになります。

  if(f.listofinteger.get(1) instanceof Integer) {
    // Do nothing
  }

  System.out.println("true");                   //prints true here
  System.out.println(f.listofinteger.get(1));

したがって、条件に関係なく、最後の 2 行が常に実行されることは明らかですif

他の人が指摘したように、if ステートメントの後のセミコロンを削除することでこれを修正できます。(そして、これは紛らわしく、見つけにくい問題であるため、FindBugsなどの多くの静的分析ツールは、これらのセミコロンを問題の可能性があるとして強調表示します。)

于 2013-06-03T08:25:11.873 に答える
0

リストを汎用リストとして渡しています...

List <Integer> listofanything文字列を追加するとコードがエラーになるため、リストを識別する必要があります...addElementコードを次のように変更しました。

List<Integer> addelement(List<Integer> listofanything)
 {
      listofanything.add("asdasdasd");            //Error when adding

    return listofanything;
 }

コンパイル中にエラーが発生しました...

于 2013-06-03T07:49:57.743 に答える