Как правильно использовать дженерики в параметре

Это мой ответ:

1, Создайте макет xml, как показано ниже:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/map_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>

2, в классе Fragment, программно добавьте карту google.

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * A simple {@link android.support.v4.app.Fragment} subclass. Activities that
 * contain this fragment must implement the
 * {@link MapFragment.OnFragmentInteractionListener} interface to handle
 * interaction events. Use the {@link MapFragment#newInstance} factory method to
 * create an instance of this fragment.
 * 
 */
public class MapFragment extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    private GoogleMap mMap;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_map, container, false);
        SupportMapFragment mMapFragment = SupportMapFragment.newInstance();
        mMap = mMapFragment.getMap();
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        transaction.add(R.id.map_container, mMapFragment).commit();
        return view;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        Log.d("Attach", "on attach");
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }
} 
0
задан rakim 22 February 2019 в 04:39
поделиться

2 ответа

Этот T может быть любого типа, расширяющего Object, и ваш код не является безопасным. Если что-то, кроме HashMap<String, String>, передано вам, вы можете получить ClassCastException. Но использование оператора instance of предотвратит это. Но все равно любой может отправить любой объект в ваш метод. Так что непроверенное предупреждение просто утверждает, что.

Использование экземпляра здесь кажется мне немного неловким. Скорее, если вы хотите добавить запись в существующую карту, вы можете изменить объявление вашего универсального метода следующим образом:

public <S, T extends Map<S, S>> void addEntryToMap(T x, S key, S value) {
    x.put(key, value);
}

Этот код безопасен по типу, более чистый и элегантный, чем описанный выше пример проверки. .

0
ответ дан Ravindra Ranwala 22 February 2019 в 04:39
поделиться

Я не уверен, что вы пытаетесь достичь в своем методе

public <T> void run(T x){ // Gets an unbounded T which means it can accept anything under Object.

    if(x instanceof HashMap){
      ((HashMap<String,String>)x).put("foo","bar"); // How are you so sure it is an HashMap<String,String>? It can be any HashMap,or even Object!! That is exactly why your compiler is telling it is doing an unchecked cast.
    }
  }

Это отвечает вашему первому пункту.

Второй момент, нам нужно больше ясности в этом, чтобы объяснить.

Третий момент. В Java есть нечто, называемое стирание типа, когда универсальный метод не может знать тип объекта во время выполнения. Вы можете перейти в класс для чтения или использовать ограниченные символы для проверки во время компиляции.

0
ответ дан Mohamed Anees A 22 February 2019 в 04:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: