Это мой ответ:
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();
}
}
Этот 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);
}
Этот код безопасен по типу, более чистый и элегантный, чем описанный выше пример проверки. .
Я не уверен, что вы пытаетесь достичь в своем методе
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 есть нечто, называемое стирание типа, когда универсальный метод не может знать тип объекта во время выполнения. Вы можете перейти в класс для чтения или использовать ограниченные символы для проверки во время компиляции.