<? extends AnyClass> <? super AnyClass>

package list;
//在看容器源代码的时候 遇到了<? extends AnyClass> <? super AnyClass> 学习了一下 希望自己把学到的讲明白
// 首先 从数组讲起,声明一下 Fruit 水果类 Apple 苹果类  Banana 香蕉类 Banana Apple extends Fruit。Fruit[10] fruit=new Apple[10];
//Fruit[0]=new Fruit();Fruit[1]=new Apple();这俩行代码在编译期间是没有任何问题的。但是fruit指向的是
//Apple 数组,在运行时会出现异常。而我们使用泛型的主要目标之一就是把这种错误检查放到编译阶段。
//List<? extends Fruit> flist=new ArrayList<? extends Apple>();
//List<? extends Fruit> flist=new ArrayList<? extends Banana>();
//在这你可以想一下你可以从flist 里add什么?可以从flist 里get什么?
//其实你肯定可以读到 (get)Fruit,因为Fruit is Fruit Apple is Fruit,Banana is Fruit;
//你不能向其中插入任何类对象(的引用),因为你add(new Apple())时,flist可能的是List<Banana>,
//add(new(Banana())时,可能指得是List<Apple>...
//你不能往List<? extends T>中插入任何类型的对象,因为你不能保证列表实际指向的类型是什么,你并不能保证列
//表中实际存储什么类型的对象。唯一可以保证的是,你可以从中读取到T或者T的子类.
//现在 事情有点走向极端了,你甚至不能向一个刚刚申明过持有Apple 对象的List 存放Apple.但编译器并不知道这一点,
//List<? extendsFruit> 可以合法的指向一个 List<Banana>,但是一旦执行这种类型的向上转型,你不可以向其中传递
//任何对象。注意是任何。
//(这时 可以走另外一条路 逆变 也就是 超类型通配符 )即所谓的<?super AnyClass>
//List<? super Apple> fl=new ArrayList<Fruit>(); 
//List<? super Apple> fl=new ArrayList<Apple>();
//List<? super Apple> fl=new ArrayList<Object>();
//在这你可以想一下 你能add什么?get什么?
//其实你可以add Apple 的所有子类及 Apple,get 什么呢?不一定能读到Fruit,有可能是Object,不一定是Apple,有可能是Fruit;
//但是一定可以读到Object(不知道具体子类);
//PECS(原则)Produce Extends Consumer Super
//如果你需要一个列表提供T类型元素(即你想从列表中读取T类型的元素),你这样申明List<? extends T>;注意你不能add元素
//如果你需要一个列表使用T类型元素(即你想从列表中addT类型的元素),你这样申明List<? super T>;注意你不能保证读到的类型
//
//
public class LearnGeneric {

}
package com.tplink.omada.sdncontroller.ui.settings.networksecurity.appcontrol; import android.content.Context; import android.os.Bundle; import androidx.activity.contextaware.OnContextAvailableListener; import androidx.annotation.CallSuper; import androidx.annotation.Nullable; import androidx.databinding.ViewDataBinding; import androidx.lifecycle.ViewModelProvider; import com.tplink.omada.sdncontroller.SdnBaseHiltActivity; import com.tplink.omada.sdncontroller.base.SdnBaseViewModel; import dagger.hilt.android.internal.lifecycle.DefaultViewModelFactories; import dagger.hilt.android.internal.managers.ActivityComponentManager; import dagger.hilt.android.internal.managers.SavedStateHandleHolder; import dagger.hilt.internal.GeneratedComponentManagerHolder; import dagger.hilt.internal.UnsafeCasts; import java.lang.Object; import java.lang.Override; import javax.annotation.processing.Generated; /** * A generated base class to be extended by the @dagger.hilt.android.AndroidEntryPoint annotated class. If using the Gradle plugin, this is swapped as the base class via bytecode transformation. */ @Generated("dagger.hilt.android.processor.internal.androidentrypoint.ActivityGenerator") public abstract class Hilt_SdnAppControlActivity<VDB extends ViewDataBinding, V extends SdnBaseViewModel> extends SdnBaseHiltActivity<VDB, V> implements GeneratedComponentManagerHolder { private SavedStateHandleHolder savedStateHandleHolder; private volatile ActivityComponentManager componentManager; private final Object componentManagerLock = new Object(); private boolean injected = false; Hilt_SdnAppControlActivity() { super(); _initHiltInternal(); } private void _initHiltInternal() { addOnContextAvailableListener(new OnContextAvailableListener() { @Override public void onContextAvailable(Context context) { inject(); } }); } private void initSavedStateHandleHolder() { savedStateHandleHolder = componentManager().getSavedStateHandleHolder(); if (savedStateHandleHolder.isInvalid()) { savedStateHandleHolder.setExtras(getDefaultViewModelCreationExtras()); } } @CallSuper @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); initSavedStateHandleHolder(); } @Override protected void onDestroy() { super.onDestroy(); if (savedStateHandleHolder != null) { savedStateHandleHolder.clear(); } } @Override public final Object generatedComponent() { return this.componentManager().generatedComponent(); } protected ActivityComponentManager createComponentManager() { return new ActivityComponentManager(this); } @Override public final ActivityComponentManager componentManager() { if (componentManager == null) { synchronized (componentManagerLock) { if (componentManager == null) { componentManager = createComponentManager(); } } } return componentManager; } protected void inject() { if (!injected) { injected = true; ((SdnAppControlActivity_GeneratedInjector) this.generatedComponent()).injectSdnAppControlActivity(UnsafeCasts.<SdnAppControlActivity>unsafeCast(this)); } } @Override public ViewModelProvider.Factory getDefaultViewModelProviderFactory() { return DefaultViewModelFactories.getActivityFactory(this, super.getDefaultViewModelProviderFactory()); } } /* * Copyright (C) 2023 The Dagger Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package dagger.hilt.android.internal.managers; import static dagger.hilt.internal.Preconditions.checkNotNull; import static dagger.hilt.internal.Preconditions.checkState; import android.os.Bundle; import androidx.annotation.Nullable; import androidx.lifecycle.SavedStateHandle; import androidx.lifecycle.SavedStateHandleSupport; import androidx.lifecycle.viewmodel.CreationExtras; import androidx.lifecycle.viewmodel.MutableCreationExtras; import dagger.hilt.android.internal.ThreadUtil; /** Implementation for SavedStateHandleHolder. */ public final class SavedStateHandleHolder { @Nullable private CreationExtras extras; @Nullable private SavedStateHandle handle; private final boolean isComponentActivity; public SavedStateHandleHolder(@Nullable CreationExtras extras) { isComponentActivity = (extras != null); this.extras = extras; } public SavedStateHandle getSavedStateHandle() { ThreadUtil.ensureMainThread(); checkState( isComponentActivity, "Activity that does not extend ComponentActivity cannot use SavedStateHandle"); if (handle != null) { return handle; } checkNotNull( extras, "The first access to SavedStateHandle should happen between super.onCreate() and" + " super.onDestroy()"); // Clean up default args, since those are unused and we don't want to duplicate those for each // SavedStateHandle MutableCreationExtras mutableExtras = new MutableCreationExtras(extras); mutableExtras.set(SavedStateHandleSupport.DEFAULT_ARGS_KEY, Bundle.EMPTY); extras = mutableExtras; handle = SavedStateHandleSupport.createSavedStateHandle(extras); extras = null; return handle; } public void clear() { extras = null; } public void setExtras(CreationExtras extras) { checkState( isComponentActivity, "setExtras should only be called for an Activity that extends ComponentActivity"); if (handle != null) { // If handle is already created, we don't need to store CreationExtras. return; } this.extras = extras; } public boolean isInvalid() { return handle == null && extras == null; } } /* * Copyright (C) 2020 The Dagger Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package dagger.hilt.android.internal.lifecycle; import static androidx.lifecycle.SavedStateHandleSupport.createSavedStateHandle; import android.app.Activity; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.viewmodel.CreationExtras; import androidx.savedstate.SavedStateRegistryOwner; import dagger.Module; import dagger.hilt.EntryPoint; import dagger.hilt.EntryPoints; import dagger.hilt.InstallIn; import dagger.hilt.android.components.ActivityComponent; import dagger.hilt.android.components.ViewModelComponent; import dagger.hilt.android.internal.builders.ViewModelComponentBuilder; import dagger.multibindings.Multibinds; import java.util.Map; import javax.inject.Provider; import kotlin.jvm.functions.Function1; /** * View Model Provider Factory for the Hilt Extension. * * <p>A provider for this factory will be installed in the {@link * dagger.hilt.android.components.ActivityComponent} and {@link * dagger.hilt.android.components.FragmentComponent}. An instance of this factory will also be the * default factory by activities and fragments annotated with {@link * dagger.hilt.android.AndroidEntryPoint}. */ public final class HiltViewModelFactory implements ViewModelProvider.Factory { /** Hilt entry point for getting the multi-binding map of ViewModels. */ @EntryPoint @InstallIn(ViewModelComponent.class) public interface ViewModelFactoriesEntryPoint { @HiltViewModelMap Map<Class<?>, Provider<ViewModel>> getHiltViewModelMap(); // From ViewModel class names to user defined @AssistedFactory-annotated implementations. @HiltViewModelAssistedMap Map<Class<?>, Object> getHiltViewModelAssistedMap(); } /** Creation extra key for the callbacks that create @AssistedInject-annotated ViewModels. */ public static final CreationExtras.Key<Function1<Object, ViewModel>> CREATION_CALLBACK_KEY = new CreationExtras.Key<Function1<Object, ViewModel>>() {}; /** Hilt module for providing the empty multi-binding map of ViewModels. */ @Module @InstallIn(ViewModelComponent.class) interface ViewModelModule { @Multibinds @HiltViewModelMap Map<Class<?>, ViewModel> hiltViewModelMap(); @Multibinds @HiltViewModelAssistedMap Map<Class<?>, Object> hiltViewModelAssistedMap(); } private final Map<Class<?>, Boolean> hiltViewModelKeys; private final ViewModelProvider.Factory delegateFactory; private final ViewModelProvider.Factory hiltViewModelFactory; public HiltViewModelFactory( @NonNull Map<Class<?>, Boolean> hiltViewModelKeys, @NonNull ViewModelProvider.Factory delegateFactory, @NonNull ViewModelComponentBuilder viewModelComponentBuilder) { this.hiltViewModelKeys = hiltViewModelKeys; this.delegateFactory = delegateFactory; this.hiltViewModelFactory = new ViewModelProvider.Factory() { @NonNull @Override public <T extends ViewModel> T create( @NonNull Class<T> modelClass, @NonNull CreationExtras extras) { RetainedLifecycleImpl lifecycle = new RetainedLifecycleImpl(); ViewModelComponent component = viewModelComponentBuilder .savedStateHandle(createSavedStateHandle(extras)) .viewModelLifecycle(lifecycle) .build(); T viewModel = createViewModel(component, modelClass, extras); viewModel.addCloseable(lifecycle::dispatchOnCleared); return viewModel; } @SuppressWarnings("unchecked") private <T extends ViewModel> T createViewModel( @NonNull ViewModelComponent component, @NonNull Class<T> modelClass, @NonNull CreationExtras extras) { Provider<? extends ViewModel> provider = EntryPoints.get(component, ViewModelFactoriesEntryPoint.class) .getHiltViewModelMap() .get(modelClass); Function1<Object, ViewModel> creationCallback = extras.get(CREATION_CALLBACK_KEY); Object assistedFactory = EntryPoints.get(component, ViewModelFactoriesEntryPoint.class) .getHiltViewModelAssistedMap() .get(modelClass); if (assistedFactory == null) { if (creationCallback == null) { if (provider == null) { throw new IllegalStateException( "Expected the @HiltViewModel-annotated class " + modelClass.getName() + " to be available in the multi-binding of " + "@HiltViewModelMap" + " but none was found."); } else { return (T) provider.get(); } } else { // Provider could be null or non-null. throw new IllegalStateException( "Found creation callback but class " + modelClass.getName() + " does not have an assisted factory specified in @HiltViewModel."); } } else { if (provider == null) { if (creationCallback == null) { throw new IllegalStateException( "Found @HiltViewModel-annotated class " + modelClass.getName() + " using @AssistedInject but no creation callback" + " was provided in CreationExtras."); } else { return (T) creationCallback.invoke(assistedFactory); } } else { // Creation callback could be null or non-null. throw new AssertionError( "Found the @HiltViewModel-annotated class " + modelClass.getName() + " in both the multi-bindings of " + "@HiltViewModelMap and @HiltViewModelAssistedMap."); } } } }; } @NonNull @Override public <T extends ViewModel> T create( @NonNull Class<T> modelClass, @NonNull CreationExtras extras) { if (hiltViewModelKeys.containsKey(modelClass)) { return hiltViewModelFactory.create(modelClass, extras); } else { return delegateFactory.create(modelClass, extras); } } @NonNull @Override public <T extends ViewModel> T create(@NonNull Class<T> modelClass) { if (hiltViewModelKeys.containsKey(modelClass)) { return hiltViewModelFactory.create(modelClass); } else { return delegateFactory.create(modelClass); } } @EntryPoint @InstallIn(ActivityComponent.class) interface ActivityCreatorEntryPoint { @HiltViewModelMap.KeySet Map<Class<?>, Boolean> getViewModelKeys(); ViewModelComponentBuilder getViewModelComponentBuilder(); } public static ViewModelProvider.Factory createInternal( @NonNull Activity activity, @NonNull SavedStateRegistryOwner owner, @Nullable Bundle defaultArgs, @NonNull ViewModelProvider.Factory delegateFactory) { return createInternal(activity, delegateFactory); } public static ViewModelProvider.Factory createInternal( @NonNull Activity activity, @NonNull ViewModelProvider.Factory delegateFactory) { ActivityCreatorEntryPoint entryPoint = EntryPoints.get(activity, ActivityCreatorEntryPoint.class); return new HiltViewModelFactory( entryPoint.getViewModelKeys(), delegateFactory, entryPoint.getViewModelComponentBuilder() ); } } package com.tplink.omada.sdncontroller.viewmodel.settings.networksecurity; import android.app.Application; import androidx.lifecycle.SavedStateHandle; import com.tplink.omada.controller.session.ControllerSessionManager; import com.tplink.omada.di.provider.DispatcherProvider; import dagger.internal.DaggerGenerated; import dagger.internal.Factory; import dagger.internal.Provider; import dagger.internal.QualifierMetadata; import dagger.internal.ScopeMetadata; import javax.annotation.processing.Generated; @ScopeMetadata @QualifierMetadata @DaggerGenerated @Generated( value = "dagger.internal.codegen.ComponentProcessor", comments = "https://dagger.dev" ) @SuppressWarnings({ "unchecked", "rawtypes", "KotlinInternal", "KotlinInternalInJava", "cast", "deprecation", "nullness:initialization.field.uninitialized" }) public final class AppControlViewModel_Factory implements Factory<AppControlViewModel> { private final Provider<Application> applicationProvider; private final Provider<ControllerSessionManager> managerProvider; private final Provider<DispatcherProvider> dispatcherProvider; private final Provider<SavedStateHandle> savedStateHandleProvider; private AppControlViewModel_Factory(Provider<Application> applicationProvider, Provider<ControllerSessionManager> managerProvider, Provider<DispatcherProvider> dispatcherProvider, Provider<SavedStateHandle> savedStateHandleProvider) { this.applicationProvider = applicationProvider; this.managerProvider = managerProvider; this.dispatcherProvider = dispatcherProvider; this.savedStateHandleProvider = savedStateHandleProvider; } @Override public AppControlViewModel get() { return newInstance(applicationProvider.get(), managerProvider.get(), dispatcherProvider.get(), savedStateHandleProvider.get()); } public static AppControlViewModel_Factory create(Provider<Application> applicationProvider, Provider<ControllerSessionManager> managerProvider, Provider<DispatcherProvider> dispatcherProvider, Provider<SavedStateHandle> savedStateHandleProvider) { return new AppControlViewModel_Factory(applicationProvider, managerProvider, dispatcherProvider, savedStateHandleProvider); } public static AppControlViewModel newInstance(Application application, ControllerSessionManager manager, DispatcherProvider dispatcherProvider, SavedStateHandle savedStateHandle) { return new AppControlViewModel(application, manager, dispatcherProvider, savedStateHandle); } } 阅读这四部分代码,告诉我savestatehandle是怎么创建并传递的?
最新发布
12-05
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值