genericsJava和类型参数的阴影

这段代码似乎工作正常

class Rule { public Rule(T t) { } public  void Foo(T t) { } } 
  1. 方法类型参数是否影响类类型参数?
  2. 另外,当你创建一个对象时,它是否使用类的类型参数?

 Rule r = new Rule(); 

这通常适用于类的类型参数,在它们不冲突的情况下吗? 我的意思是当只有类有一个类型参数,而不是构造函数,或者这是否在构造函数中查找类型参数? 如果他们发生冲突 ,这会如何变化?

请参阅下面的讨论

如果我有一个函数调用

 x = method(); // this is a syntax error even inside the function or class ; I must place a this before it, why is this, and does everything still hold true. Why don't I need to prefix anything for the constructor call. Shouldn't Oracle fix this. 

你的所有T都是不同的,但如果用完整的语法调用你的方法,你只能看到它:

例如,此代码有效:

 new Rule().Foo(); 

为了使这更容易解释,让我们假设您的代码是这样的:

 class Rule { public Rule() { } public  void Foo() { } } 

然后你可以显式声明generics类型,如:

 new Rule().Foo(); 

如果类型具有相同的名称,则将选择最内层的类型(方法上的T ,而不是类):

使用此代码,参数:

 class Rule { public Rule(T t) { } public  void Foo(T t) { } } 

那么这是有效的:

 new Rule(3.2f); 

请注意,构造函数中的TFloat ,而不是Integer

另一个例子:

 class Example { public  void foo1() { // T here is the  declared on foo1 } public void foo2() { // T here is the  declared on the class Example } } 

我发现另一个问题涉及使用显式generics类型调用方法而没有它们之前的东西 。 看起来静态导入和同类方法调用是相同的。 看起来Java不允许你出于某种原因用开始一行。

方法类型参数是否影响类类型参数?

构造函数上的声明未引用类类型。 所以是的,它影响了类类型参数。

在这种情况下,它用作可以与构造函数一起使用的generics类型参数,例如作为参数。 试试这个构造函数:

 public 

Rule(P arg1, P arg2) { }

正如您所看到的,我定义了一个类型

,然后我使用它来确保参数将是P类型。 在您的情况下,您声明一个对构造函数有效的类型而不使用它。

看看这个页面 。

另外,当你创建一个对象时,它是否使用类的类型参数?

每个generics类型定义都将范围作为变量。 因此,在构造函数之外返回有效的类类型。