Java中令牌的含义是什么?
<?>
从www.JavaPractices.com复制的此代码中的令牌是什么意思?当我用更<T>
通用的泛型类型替换它时,它无法编译。(错误:T无法解析为类型。)为什么?
// <?> occurs 3 times in the entire program. When it is replaced with <T> the// program no longer compiles.
void activateAlarmThenStop()
{
Runnable myPeriodicTask = new PeriodicTask();
ScheduledFuture<?> soundAlarmFuture =
this.executorService.scheduleWithFixedDelay(myPeriodicTask,
startT,
period,
TimeUnit.SECONDS
);
Runnable stopAlarm = new StopAlarmTask(soundAlarmFuture);
this.executorService.schedule(stopAlarm, stopT, TimeUnit.SECONDS);
}
private final class StopAlarmTask implements Runnable
{
StopAlarmTask(ScheduledFuture<?> aSchedFuture)
{
fSchedFuture = aSchedFuture;
}
public void run()
{
CConsole.pw.println("Stopping alarm.");
fSchedFuture.cancel(doNotInterruptIfRunningFlag);
executorService.shutdown();
}
private ScheduledFuture<?> fSchedFuture;
}
编辑:当然,当我们使用类似的通用类型标记时<T>
,它必须出现在类声明中。这里也没有<T>
,也没有<?>
在类的声明,但它仍然可以编译和运行正常。
回答:
它无法编译,因为您的类不是通用的(也不是您的任何方法)。在此特定示例中,小丑(?)表示ScheduledFuture可以由任何参数设置。
有时,如果您在内部使用另一个泛型类并且不知道将使用的确切类型,则使整个类成为泛型是没有意义的。在此示例中,您有三个选择:
- 使StopAlarmTask通用(在这种情况下没有意义)
- 在ScheduledFuture中使用具体类型,但是它只会是一种可能的结果类型,例如String或Integer
- 使用通配符(
< ? >
)-允许检索FutureResult(字符串,整数,自定义类)的结果。您还可以将可能的泛型类型的范围缩小为某些子类,例如ScheduledGeneric< ? extends MyObject >
或为超类:ScheduledGeneric< ? super MyObject >
以上是 Java中令牌的含义是什么? 的全部内容, 来源链接: utcz.com/qa/423371.html