简体   繁体   中英

method does not override or implement a method from a supertype - for Override

I have looked all around but can't figure out why I'm getting the error

error: method does not override or implement a method from a supertype

This highlights the two @Override s I have in a method (subroutine?). Here's my MainActivity.java - the part of the code it occurs in the queryBooks() method at the end - the @Override s are both underlined red.

package com.example.batman.myapplication;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v4.view.MenuItemCompat;
//import android.support.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.ShareActionProvider;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;


import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.JsonHttpResponseHandler;

import org.json.JSONObject;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemClickListener {
    TextView mainTextView;
    EditText mainEditText;
    ListView mainListView;
    ArrayAdapter mArrayAdapter;
//  ArrayList<String> mNameList = new ArrayList<String>();
    ArrayList mNameList = new ArrayList();
    android.support.v7.widget.ShareActionProvider mShareActionProvider;

    // This is for internet stuff
    private static final String QUERY_URL = "http://openlibrary.org/search.json?q=";


    // Setting up the storage of data
    private static final String PREFS = "prefs";
    private static final String PREF_NAME = "name";
    SharedPreferences mSharedPreferences;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 1. Access the TextView defined in layout XML
        // and then set its text
        mainTextView = (TextView) findViewById(R.id.main_textview);
//      mainTextView.setText("Set in Java!");

        Button mainButton;
        mainButton = (Button) findViewById(R.id.main_button);
        mainButton.setOnClickListener(this);

        // 3.  Access the EditText defined in layout XML
        mainEditText = (EditText) findViewById(R.id.main_edittext);

        // 4. Access the ListView
        mainListView = (ListView) findViewById(R.id.main_listview);
        // Create an ArrayAdapter for the ListView
        mArrayAdapter = new ArrayAdapter(this,
                android.R.layout.simple_list_item_1,
                mNameList);
        // Set the ListView to use the ArrayAdapter
        mainListView.setAdapter(mArrayAdapter);

        // 5. Set this activity to react to list items being pressed
        mainListView.setOnItemClickListener(this);

        // 7. Greet the user, or ask for their name if new
        displayWelcome();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu.
        // Adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);

        // Access the Share Item defined in menu XML
        MenuItem shareItem = menu.findItem(R.id.menu_item_share);

        // Access the object responsible for
        // putting together the sharing submenu
        if (shareItem != null) {
            mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
        }

        // Create an Intent to share your content
        setShareIntent();

        return true;
    }

    private void setShareIntent() {

        if (mShareActionProvider != null) {

            // create an Intent with the contents of the TextView
            Intent shareIntent = new Intent(Intent.ACTION_SEND);
            shareIntent.setType("text/plain");
            shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Android Development");
            shareIntent.putExtra(Intent.EXTRA_TEXT, mainTextView.getText());

            // Make sure the provider knows
            // it should work with that Intent
            mShareActionProvider.setShareIntent(shareIntent);
        }
    }

    @Override
    public void onClick(View v) {
//      // Take what was typed into the EditText
//      // and use in TextView
//      mainTextView.setText(mainEditText.getText().toString() + ".");
//
//      // Also add that value to the list shown in the ListView
//      mNameList.add(mainEditText.getText().toString());
//      mArrayAdapter.notifyDataSetChanged();
//      // 6. The text you'd like to share has changed,
//      // and you need to update
//      setShareIntent();
//
//      if(v == mainEditText) {
//          mainEditText.setText("");
//      }

        // 9. Take what was typed into the EditText and use in search
        // (the above is commented out, per tutorial part 3 - this takes its place as input
        queryBooks(mainEditText.getText().toString());
//      mainEditText.setText("");
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        // Log the item's position and contents
        // to the console in Debug
        Log.d("My Application", position + ": " + mNameList.get(position));
    }

    public void displayWelcome() {

        // Access the device's key-value storage
        mSharedPreferences = getSharedPreferences(PREFS, MODE_PRIVATE);

        // Read the user's name,
        // or an empty string if nothing found
        String name = mSharedPreferences.getString(PREF_NAME, "");

        if (name.length() > 0) {

            // If the name is valid, display a Toast welcoming them
            Toast.makeText(this, "Welcome back, " + name + "!", Toast.LENGTH_LONG).show();
        } else {

            // otherwise, show a dialog to ask for their name
            AlertDialog.Builder alert = new AlertDialog.Builder(this);
            alert.setTitle("Hello!");
            alert.setMessage("What is your name?");

            // Create EditText for entry
            final EditText input = new EditText(this);
            alert.setView(input);

            // Make an "OK" button to save the name
            alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int whichButton) {

                    // Grab the EditText's input
                    String inputName = input.getText().toString();

                    // Put it into memory (don't forget to commit!)
                    SharedPreferences.Editor e = mSharedPreferences.edit();
                    e.putString(PREF_NAME, inputName);
                    e.commit();

                    // Welcome the new user
                    Toast.makeText(getApplicationContext(), "Welcome, " + inputName + "!", Toast.LENGTH_LONG).show();
                }
            });
        // Make a "Cancel" button
        // that simply dismisses the alert
                    alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog, int whichButton) {}
                    });

            alert.show();
    }
    }

    // Internet stuff
    private void queryBooks(String searchString) {

        // Prepare your search string to be put in a URL
        // It might have reserved characters or something
        String urlString = "";
        try {
            urlString = URLEncoder.encode(searchString, "UTF-8");
        } catch (UnsupportedEncodingException e) {

            // if this fails for some reason, let the user know why
            e.printStackTrace();
            Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
        }

        // Create a client to perform networking
        AsyncHttpClient client = new AsyncHttpClient();

        // Have the client get a JSONArray of data
        // and define how to respond
        client.get(QUERY_URL + urlString,
                new JsonHttpResponseHandler() {

                    @Override // THIS METHOD DOES NOT OVERRIDE METHOD FROM ITS SUPERCLASS ??
                    public void onSuccess(JSONObject jsonObject) {
                        // Display a "Toast" message
                        // to announce your success
                        Toast.makeText(getApplicationContext(), "Success!", Toast.LENGTH_LONG).show();

                        // 8. For now, just log results
                        Log.d("omg android", jsonObject.toString());
                    }

                    @Override // THIS METHOD DOES NOT OVERRIDE METHOD FROM ITS SUPERCLASS ??
                    public void onFailure(int statusCode, Throwable throwable, JSONObject error) {
                        // Display a "Toast" message
                        // to announce the failure
                        Toast.makeText(getApplicationContext(), "Error: " + statusCode + " " + throwable.getMessage(), Toast.LENGTH_LONG).show();

                        // Log error message
                        // to help solve any problems
                        Log.e("omg android", statusCode + " " + throwable.getMessage());
                    }
                });
    }
} // end class

(For what it's worth, I'm following this tutorial).

Thanks for any thoughts!

The problem is what the error message is saying: "the method does not override or implement a method from a supertype". You annotated both methods with the Override annotation , however, no method with the same signature ( ie the parameters ) can be found in the supertype ( JsonHttpResponseHandler ).

If you take a look at the documentation of JsonHttpResponseHandler , you can see all the available onSuccess(...) and onFailure(...) methods.

Here is the working version of your code (note that changes in the method signatures):

client.get(QUERY_URL + urlString,
    new JsonHttpResponseHandler() {

        @Override
        public void onSuccess(int statusCode, org.apache.http.Header[] headers, JSONObject jsonObject) {
            // Display a "Toast" message
            // to announce your success
            Toast.makeText(getApplicationContext(), "Success!", Toast.LENGTH_LONG).show();

            // 8. For now, just log results
            Log.d("omg android", jsonObject.toString());
        }

        @Override
        public void onFailure(int statusCode, org.apache.http.Header[] headers, Throwable throwable, JSONObject error) {
            // Display a "Toast" message
            // to announce the failure
            Toast.makeText(getApplicationContext(), "Error: " + statusCode + " " + throwable.getMessage(), Toast.LENGTH_LONG).show();

            // Log error message
            // to help solve any problems
            Log.e("omg android", statusCode + " " + throwable.getMessage());
        }
    });

Note that starting from Android 6.0 (API level 23) the Apache library (org.apache.http.*) is not available anymore. If you want to continue using that, see Behavior Changes for more information.

Some personal opinion: I wouldn't recommend using the Asynchronous HTTP Library as it's built on top of the obsolete (and from API level 23, removed) Apache HttpClient , which has poor performance compared to HttpURLConnection . Quote from the Android developers about HttpURLConnection :

This API is more efficient because it reduces network use through transparent compression and response caching, and minimizes power consumption.

Easy solution to fixed above issue

Wrong code:

public class BatteryStatusPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
    List<NativeModule> modules = new ArrayList<>();

    modules.add(new BatteryStatusModule(reactContext));

    return modules;
}

@Override
public List<Class<? extends JavaScriptModule>> createJSModules() {
    return Collections.emptyList();
}

@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
    return Collections.emptyList();
}
}

Solution:

Here i just removed @override

public class BatteryStatusPackage implements ReactPackage {

public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
    List<NativeModule> modules = new ArrayList<>();

    modules.add(new BatteryStatusModule(reactContext));

    return modules;
}

public List<Class<? extends JavaScriptModule>> createJSModules() {
    return Collections.emptyList();
}

public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
    return Collections.emptyList();
}
}

I am not sure which version of loopj library you are using, but from this Javadoc link , your onSuccess and onFailure method signatures are both different.

They have to be,

@Override
public void onSuccess(int statusCode,
                      org.apache.http.Header[] headers,
                      org.json.JSONObject response) {}

@Override
public void onFailure(int statusCode,
                      org.apache.http.Header[] headers,
                      java.lang.Throwable throwable,
                      org.json.JSONObject errorResponse) {}

Note the headers parameter you have missed.

The tutorial you're following uses version 1.4.4 of the Asynchronous Http Client library. You're probably using another version.

Either specify this version on your Gradle configuration:

dependencies {
    ...
    compile 'com.loopj.android:android-async-http:1.4.4'
    ...
}

Or change your definition to reflect the method signatures of the version you're using, for example for 1.4.8 (latest):

@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
    // ...
}

@Override
public void onFailure(int statusCode,
                  org.apache.http.Header[] headers,
                  java.lang.Throwable throwable,
                  org.json.JSONObject errorResponse) {
    // ...
}

add a Java doc for your class, in order to override or implement super class behaviors.

Unfortunately I have no source, and thats how I cracked mine.

And the gist is that a Java doc is not just a doc, it's a tool that informs construction based matters of classes. And it passes data across for getters and setters, classes etc

It handles API matters in a form of HTML DOCUMENT.

Hope it helps some bodies. 🙂

I had this problem in this case (code is simplified):

public interface SomeInterface {
Long getField();
}

@SuperBuilder
public abstract class Parent implements SomeInterface {

private field;

@Override
public Long getField() {
return field;
}


@SuperBuilder(toBuilder = true)
public class Child extends Parent {
//some code here
}

}

I solved it by deleting "(toBuilder = true)" in Child.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM