繁体   English   中英

在这种情况下如何在Java泛型中使用多个界限

[英]How to use multiple bounds in java generics in this case

我试图为这样的事情创建一个构造函数。

public <T extends AppCompatActivity & DialogInterface.OnDismissListener> GooglePlayUtils(T activity) {
    this.activity = activity;
}

Android Studio对此没有任何抱怨,但是在CompileDebugJava上构建失败

但是,如果删除第二个边界,则编译效果很好。 我做错了吗?还是我缺少其他因素?

编辑将类型参数添加到类本身而不是构造函数后,为我解决了这个问题。 但是,仍然要开放问题,以便有人可以解释为什么吗?

编辑2将类型参数添加到类而不是构造函数

public abstract class GooglePlayUtils<T extends AppCompatActivity & DialogInterface.OnDismissListener> {

private T activity;

public GooglePlayUtils(T activity) {
    this.activity = activity;
}

错误

java.lang.AssertionError:在com.sun.tools.javac.util.Assert.error(Assert.java:133)在com.sun.tools.javac.util.Assert.check(Assert.java:86)在com com.sun.tools.javac.comp.Attr.visitMethodDef(Attr.java:723)上的.sun.tools.javac.comp.Attr.attribBounds(Attr.java:561)在com.sun.tools.javac.tree上.JCTree $ JCMethodDecl.accept(JCTree.java:669)在com.sun.tools.javac.comp.Attr.attribTree(Attr.java:431)在com.sun.tools.javac.comp.Attr.attribTree(Attr com.sun.tools.javac.comp.Attr.attribStat(Attr.java:480)处com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:3250)处的.java:418)。位于com.sun.tools.javac.comp.Attr.attribClass(Attr.java:3109)的com.sun.tools.javac.comp处的sun.tools.javac.comp.Attr.attribClass(Attr.java:3173) com.sun.tools.javac.tree.JCTree $ JCClassDecl.accept(JCTree.java:591)处的Attr.visitClassDef(Attr.java:708)com.sun.tools.javac.comp.Attr.attribTree(Attr。 java:431)com.sun.tools.javac.comp.Attr.attribTree(Attr.java:418)at com.sun.tools.javac.comp.Attr.attribStat(Attr .java:480)at com.sun.tools.javac.comp.Attr.visitNewClass(Attr.java:1790)at com.sun.tools.javac.tree.JCTree $ JCNewClass.accept(JCTree.java:1372)at com.sun.tools.javac上的com.sun.tools.javac.comp.Attr.attribTree(Attr.java:431)com.sun.tools.javac上的com.sun.tools.javac.comp.Attr.attribTree(Attr.java:418)。 com.sun.tools.javac.comp.Attr.visitAssign(Attr.java:1993)处的comp.Attr.attribExpr(Attr.java:449)com.sun.tools.javac.tree.JCTree $ JCAssign.accept( com.sun.tools.javac.comp.Attr.attribTree(Attr.java:431)的com.sun.tools.javac.comp.Attr.attribTree(Attr.java:418)的JCTree.java:1466) com.sun.tools.javac.comp.Attr.visitExec(Attr.java:1294)处的.sun.tools.javac.comp.Attr.attribExpr(Attr.java:460)在com.sun.tools.javac.tree处.JCTree $ JCExpressionStatement.accept(JCTree.java:1167)在com.sun.tools.javac.comp.Attr.attribTree(Attr.java:431)在com.sun.tools.javac.comp.Attr.attribTree(Attr .java:418)at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:480)at com.sun.tools.javac.comp.Attr.attribStats(Attr.jav a:496)at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:918)at com.sun.tools.javac.tree.JCTree $ JCBlock.accept(JCTree.java:781)at com。 com.sun.tools.javac.comp.Attr.attribTree(Attr.java:418)处的com.sun.tools.javac.comp处的.sun.tools.javac.comp.Attr.attribTree(Attr.java:431) .com.sun.tools.javac.comp.Attr.visitMethodDef(Attr.java:836)的.Attr.attribStat(Attr.java:480)在com.sun.tools.javac.tree.JCTree $ JCMethodDecl.accept(JCTree com.sun.tools.javac.comp.Attr.attribTree(Attr.java:431)处com.sun.tools.javac.comp.Attr.attribTree(Attr.java:418)处的.java:669)。 com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:3250)上的sun.tools.javac.comp.Attr.attribStat(Attr.java:480)在com.sun.tools.javac.comp上。 com.sun.tools.javac.comp.Attr.attribClass(Attr.java:3109)的com.sun.tools.javac.comp.Attr.attrib(Attr.java:的Attr.attribClass(Attr.java:3173) 3083),com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1184),com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompil er.java:870)com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:829)com.sun.tools.javac.main.Main.compile(Main.java:439) org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:45)的.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:132)在org.gradle.api.internal org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:101)的.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:33)在org.gradle.api.internal.tasks.compile org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:50)在org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(NormalizingJavaCompiler.java:36) (CleaningJavaCompilerSupport.java:34)在org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:25)在org.gradle.api.tasks.compile.JavaCompile.pe org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:137)的rformCompilation(JavaCompile.java:157)org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:91)在org.gradle.internal上的java.lang.reflect.Method.invoke(Method.java:606)上的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)上的sun.reflect.GeneratedMethodAccessor1481.invoke(未知源) org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory $ IncrementalTask​​Action.doExecute(AnnotationProcessingTaskFactory.java:243)的.reflect.JavaMethod.invoke(JavaMethod.java:75)org.gradle.api.internal.project.taskfactory org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory $ StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:219)在org.gradle.api.internal.project.taskfactory处的AnnotationProcessingTaskFactory $ IncrementalTask​​Action.execute(AnnotationProcessingTaskFactory.java:230) .AnnotationProcessingTaskFactory $ STANDAR org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)处的dTaskAction.execute(AnnotationProcessingTaskFactory.java:208) org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)上的ExecuteActionsTaskExecuter.java:61)org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter。 35)在org.org.grad.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)在org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)在org.org .gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42)位于org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.ja va:52)在org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)在org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceOnceTaskExecuter.java:43)在org.gradle.execution.taskgraph.Abs​​tractTaskPlanExecutor $ TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79)的org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:310)处org.gradle.execution.taskgraph.Abs​​tractTaskPlanExecutor $ TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51)处的$ TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63)在org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23:23) )在org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)在org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)在org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:88) org.gradle.execution.DefaultBuildExecuter.access $ 200(DefaultBuildExecuter.java:23)处的dle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62),org.gradle.execution.DefaultBuildExecuter $ 2.proceed(DefaultBuildExecuter.java:68)在org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)在org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62)在org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:55) )org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149)org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106)org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java: 86)在org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.j)上的org.gradle.launcher.exec.InProcessBuildActionExecuter $ DefaultBuildController.run(InProcessBuildActionExecuter.java:90) ava:54)位于org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)位于org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)位于org.gradle.launcher.exec org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:49)上的.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)在org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute上(BuildCommandOnly.java:36)在org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)在org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java :37),位于org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26),位于org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.ja va:120)在org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)上的org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)在org.org.gradle.launcher.daemon.server.exec.ForwardClientInput $ 2.call(ForwardClientInput.java:74)在org.org.gradle.launcher.daemon.server.exec.ForwardClientInput $ 2.call(ForwardClientInput.java:72) org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)上的.gradle.util.Swapper.swap(Swapper.java:38)在org.gradle.launcher.daemon.server.api上org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47)处的.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)在org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed (DaemonCommandExecution.java:120)在org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:66)在org.gradle.launcher.daemon.server org.gradle.launcher.daemon.server.exec.Build.Environment上的.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)在org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)的.doBuild(BuildBuildEnvironment.java:71)org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecutionion) .java:120),位于org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41),位于org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) )在org.gradle.launcher.daemon.server.DaemonStateCoordinator $ 1.run(DaemonStateCoordinator $ 1.run(DaemonStateCoordinator.java:246)在org.org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy $ 1.run(StartBuildOrRespondWithBusy.java:50)处。 gradle.internal.concurrent.ExecutorPolicy $ CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)在org.grad le.internal.concurrent.StoppableExecutorImpl $ 1.run(StoppableExecutorImpl.java:40)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java :615),位于java.lang.Thread.run(Thread.java:745)

您是要创建通用类,还是要创建其构造函数接受通用参数的具体类?

如果您试图创建一个通用类,则可以为扩展AppCompatActivity & DialogInterface.OnDismissListener对象实例化该类,您需要使该类通用(如在编辑中一样)。 在泛型类中,不需要在构造函数定义中重复类类型参数,它们由编译器隐式假定。

如果尝试创建某个特定类型或通用类型的类,其构造函数可以接受扩展AppCompatActivity & DialogInterface.OnDismissListener对象,则需要一种方法将该参数显式this.activitythis.activity定义为的任何类型。 在不强制this.activity情况下将常规activity参数分配给this.activity的唯一方法是类型擦除后它们是否为同一类型。

虽然可以创建一个构造函数,该构造函数的参数是通用的,但是您不能在不进行强制转换的情况下将通用参数分配给其他类型的类型(在类型擦除之后)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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