JLS在类型推断算法(第15.12.2节)中提到:
上述过程有可能产生无限类型.这是允许的,Java编译器必须识别这种情况并使用循环数据结构恰当地表示它们.
但是,我无法找到javac生成无限类型的实际示例.我认为在下列情况下应该产生一个:
<T> T pick(T a, T b) { ... }
pick("string", 3);
Run Code Online (Sandbox Code Playgroud)
String和Integer都是Comparable <themselve>,因此它们的常用超类型应该是Comparable<? extends Comparable<? extends Comparable<? ...>>>
(无限的).
我可以:
Comparable<? extends Comparable<?>> x = pick("string", 3);
Run Code Online (Sandbox Code Playgroud)
但后来我试过了:
Comparable<? extends Comparable<? extends Comparable<?>>> x = pick("string", 3);
Run Code Online (Sandbox Code Playgroud)
这不编译.似乎递归在两个步骤后中止.
您是否知道Java实际上会产生无限类型?
-
编辑:似乎以上是编译器错误.阅读规范,让我们看看如何计算lub(String, Integer)
:
ST(String) = { String, Comparable<String>, Serializable, CharSequence, Object }
ST(Integer) = { Integer, Comparable<Integer>, Serializable, Number, Object }
EC = { Comparable, Serializable, Object }
MEC = { Comparable, Serializable }
Inv(Comparable) …
Run Code Online (Sandbox Code Playgroud) 我有一个消耗WPF TextInput事件的自定义控件.这在使用键盘时工作正常; 但是,如果使用"Tablet PC输入面板"(Windows 7附带)的手写识别,单击"插入"按钮时不会发生TextInput事件.
public partial class Window1 : Window
{
public Window1()
{
}
protected override void OnTextInput(TextCompositionEventArgs e)
{
base.OnTextInput(e);
this.Title = e.Text;
}
}
class Text : Control
{
static Text()
{
KeyboardNavigation.IsTabStopProperty.OverrideMetadata(
typeof(Text), new FrameworkPropertyMetadata(true));
KeyboardNavigation.TabNavigationProperty.OverrideMetadata(
typeof(Text), new FrameworkPropertyMetadata(KeyboardNavigationMode.None));
FocusableProperty.OverrideMetadata(
typeof(Text), new FrameworkPropertyMetadata(true));
}
public static readonly DependencyProperty EnteredTextProperty =
DependencyProperty.Register("EnteredText", typeof(string), typeof(Text),
new FrameworkPropertyMetadata());
public string EnteredText {
get { return (string)GetValue(EnteredTextProperty); }
set { SetValue(EnteredTextProperty, value); }
}
protected override void OnTextInput(TextCompositionEventArgs e) …
Run Code Online (Sandbox Code Playgroud) 我正在使用第三方Windows窗体控件,使用Application.Idle事件执行一些"延迟"操作.
现在我们将应用程序移动到WPF,这些操作停止了.我发现没有按预期引发System.Windows.Forms.Application.Idle事件.
如何在WPF应用程序中触发Idle事件,以便我可以继续使用该第三方控件(在WindowsFormsHost中)?这是不是可以修改Windows窗体控件.