类 java.util.ArrayList 具有泛型类型参数,请改用 GenericTypeIndicator
Posted
技术标签:
【中文标题】类 java.util.ArrayList 具有泛型类型参数,请改用 GenericTypeIndicator【英文标题】:Class java.util.ArrayList has generic type parameters, use GenericTypeIndicator instead 【发布时间】:2019-01-09 11:46:20 【问题描述】:这是日志:
08-02 00:51:18.627 15840-15840/com.cosmichawk.classpro E/androidRuntime: 致命异常: main 进程:com.cosmichawk.classpro,PID:15840 com.google.firebase.database.DatabaseException:类 java.util.ArrayList 具有泛型类型参数,请使用 而是 GenericTypeIndicator 在 com.google.android.gms.internal.firebase_database.zzkt.zzb(未知 资源) 在 com.google.android.gms.internal.firebase_database.zzkt.zza(未知 资源) 在 com.google.android.gms.internal.firebase_database.zzkt.zzb(未知 资源) 在 com.google.android.gms.internal.firebase_database.zzku.zza(未知 资源) 在 com.google.android.gms.internal.firebase_database.zzkt.zzb(未知 资源) 在 com.google.android.gms.internal.firebase_database.zzkt.zza(未知 资源) 在 com.google.firebase.database.DataSnapshot.getValue(未知来源) 在 com.cosmichawk.classpro.MainActivity$6.onDataChange(MainActivity.java:205) 在 com.google.android.gms.internal.firebase_database.zzfc.zza(未知 资源) 在 com.google.android.gms.internal.firebase_database.zzgx.zzdr(未知 资源) 在 com.google.android.gms.internal.firebase_database.zzhd.run(未知 资源) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6186) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
主要活动:
包 com.cosmichawk.classpro;
导入 android.content.Intent;进口 android.support.v7.app.AlertDialog;进口 android.support.v7.app.AppCompatActivity;导入android.os.Bundle; 导入 android.text.TextUtils;导入 android.view.LayoutInflater; 导入android.view.View;导入 android.widget.AdapterView;进口 android.widget.ArrayAdapter;导入android.widget.Button;进口 android.widget.EditText;导入 android.widget.ListView;进口 android.widget.Spinner;导入android.widget.Toast;
导入 com.google.firebase.database.DataSnapshot;进口 com.google.firebase.database.DatabaseError;进口 com.google.firebase.database.DatabaseReference;进口 com.google.firebase.database.FirebaseDatabase;进口 com.google.firebase.database.ValueEventListener;
导入 java.util.ArrayList;导入 java.util.List;
公共类 MainActivity 扩展 AppCompatActivity public static final String ARTIST_NAME = "com.cosmichawk.classpro.artistname"; public static final String ARTIST_ID = "com.cosmichawk.classpro.artistid";
EditText editTextName,editTextAmount, editTextNumber; Button buttonAddArtist; ArrayList array; ListView listViewArtists; //a list to store all the artist from firebase database List<Artist> artists; //our database reference object DatabaseReference databaseArtists; @Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //getting the reference of artists node databaseArtists = FirebaseDatabase.getInstance().getReference("artists"); //getting views editTextName = (EditText) findViewById(R.id.editTextName); editTextAmount = (EditText) findViewById(R.id.editTextAmount); editTextNumber = (EditText) findViewById(R.id.editTextNumber); listViewArtists = (ListView) findViewById(R.id.listViewArtists); buttonAddArtist = (Button) findViewById(R.id.buttonAddArtist); //list to store artists artists = new ArrayList<>(); //adding an onclicklistener to button buttonAddArtist.setOnClickListener(new View.OnClickListener() @Override public void onClick(View view) //calling the method addArtist() //the method is defined below //this method is actually performing the write operation addArtist(); ); //attaching listener to listview listViewArtists.setOnItemClickListener(new AdapterView.OnItemClickListener() @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) //getting the selected artist Artist artist = artists.get(i); //creating an intent Intent intent = new Intent(getApplicationContext(), ArtistActivity.class); //putting artist name and id to intent intent.putExtra(ARTIST_ID, artist.getArtistId()); intent.putExtra(ARTIST_NAME, artist.getArtistName()); //starting the activity with intent startActivity(intent); ); listViewArtists.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() @Override public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) Artist artist = artists.get(i); showUpdateDeleteDialog(artist.getArtistId(), artist.getArtistName()); return true; ); private void showUpdateDeleteDialog(final String artistId, String artistName) AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); LayoutInflater inflater = getLayoutInflater(); final View dialogView = inflater.inflate(R.layout.update_dialog, null); dialogBuilder.setView(dialogView); final EditText editTextName = (EditText) dialogView.findViewById(R.id.editTextName); final EditText editTextAmount = (EditText) dialogView.findViewById(R.id.editTextAmount); final EditText editTextNumber = (EditText) dialogView.findViewById(R.id.editTextNumber); final Button buttonUpdate = (Button) dialogView.findViewById(R.id.buttonUpdateArtist); final Button buttonDelete = (Button) dialogView.findViewById(R.id.buttonDeleteArtist); dialogBuilder.setTitle(artistName); final AlertDialog b = dialogBuilder.create(); b.show(); buttonUpdate.setOnClickListener(new View.OnClickListener() @Override public void onClick(View view) String name = editTextName.getText().toString().trim(); String amount = editTextAmount.getText().toString().trim(); String number = editTextNumber.getText().toString().trim(); int fb = Integer.parseInt(amount); int rl = Integer.parseInt(number); int m = fb / rl; ArrayList array=new ArrayList(); if (!TextUtils.isEmpty(name)) for(int l=0; l<rl; l++) array.add(l,m); Toast.makeText(getBaseContext(), array+"", Toast.LENGTH_SHORT).show(); updateArtist(artistId, name, amount, number, array); b.dismiss(); ); buttonDelete.setOnClickListener(new View.OnClickListener() @Override public void onClick(View view) deleteArtist(artistId); b.dismiss(); ); private boolean updateArtist(String id, String name, String amount, String number, ArrayList array) //getting the specified artist reference DatabaseReference dR = FirebaseDatabase.getInstance().getReference("artists").child(id); //updating artist Artist artist = new Artist(id, name, amount, number, array); dR.setValue(artist); Toast.makeText(getApplicationContext(), "Artist Updated", Toast.LENGTH_LONG).show(); return true; private boolean deleteArtist(String id) //getting the specified artist reference DatabaseReference dR = FirebaseDatabase.getInstance().getReference("artists").child(id); //removing artist dR.removeValue(); //getting the tracks reference for the specified artist DatabaseReference drTracks = FirebaseDatabase.getInstance().getReference("tracks").child(id); //removing all tracks drTracks.removeValue(); Toast.makeText(getApplicationContext(), "Artist Deleted", Toast.LENGTH_LONG).show(); return true; @Override protected void onStart() super.onStart(); //attaching value event listener databaseArtists.addValueEventListener(new ValueEventListener() @Override public void onDataChange(DataSnapshot dataSnapshot) //clearing the previous artist list artists.clear(); //iterating through all the nodes for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) //getting artist Artist artist = postSnapshot.getValue(Artist.class); //adding artist to the list artists.add(artist); //creating adapter ArtistList artistAdapter = new ArtistList(MainActivity.this, artists); //attaching adapter to the listview listViewArtists.setAdapter(artistAdapter); @Override public void onCancelled(DatabaseError databaseError) ); /* * This method is saving a new artist to the * Firebase Realtime Database * */ private void addArtist() //getting the values to save String name = editTextName.getText().toString().trim(); String amount = editTextAmount.getText().toString().trim(); String number = editTextNumber.getText().toString().trim(); int fb = Integer.parseInt(amount); int rl = Integer.parseInt(number); int m = fb / rl; ArrayList array = new ArrayList(); for(int l=0; l<rl; l++) array.add(l,m); Toast.makeText(getBaseContext(), array+"", Toast.LENGTH_SHORT).show(); //checking if the value is provided if (!TextUtils.isEmpty(name)) //getting a unique id using push().getKey() method //it will create a unique id and we will use it as the Primary Key for our Artist String id = databaseArtists.push().getKey(); //creating an Artist Object Artist artist = new Artist(id, name, amount, number, array); //Saving the Artist databaseArtists.child(id).setValue(artist); //setting edittext to blank again editTextName.setText(""); editTextAmount.setText(""); editTextNumber.setText(""); //displaying a success toast Toast.makeText(this, "Artist added", Toast.LENGTH_LONG).show(); else //if the value is not given displaying a toast Toast.makeText(this, "Please enter a name", Toast.LENGTH_LONG).show();
此外,Artist.java 配备了它的空构造函数
包 com.cosmichawk.classpro;
导入 com.google.firebase.database.IgnoreExtraProperties;
导入 java.sql.Array;导入 java.util.ArrayList;
@IgnoreExtraProperties 公共类艺术家 私人字符串艺术家ID; 私人字符串艺术家姓名; 私人字符串艺术家数量; 私人字符串艺术家编号; 私有 ArrayList 艺术家数组;
public Artist() //this constructor is required public Artist(String artistId, String artistName, String artistAmount, String artistNumber, ArrayList artistArray) this.artistId = artistId; this.artistName = artistName; this.artistAmount = artistAmount; this.artistNumber = artistNumber; this.artistArray = artistArray; public String getArtistId() return artistId; public String getArtistName() return artistName; public String getArtistAmount() return artistAmount; public String getArtistNumber() return artistNumber; public ArrayList getArtistArray() return artistArray;
这是我的数据库的样子:-
enter image description here
【问题讨论】:
如果您将我的答案标记为已接受的答案,我将不胜感激。谢谢 请添加您的数据库结构。 添加数据库结构 【参考方案1】:你需要指定类型
artists = new ArrayList<Artist>();
更简洁的方法是在声明空间中初始化艺术家
所以不是
List<Artist> artists;
你可以这样做
List<Artist> artists = new ArrayList<>();
【讨论】:
这一次显示了数组,但应用力关闭时出现完全相同的错误以上是关于类 java.util.ArrayList 具有泛型类型参数,请改用 GenericTypeIndicator的主要内容,如果未能解决你的问题,请参考以下文章
未找到 Java 类 java.util.ArrayList、Java 类型类 java.util.ArrayList 和 MIME 媒体类型 application/json 的消息正文编写器
JDK1.8源码——java.util.ArrayList 类