此代码似乎工作正常
class Rule<T>
{
public <T>Rule(T t)
{
}
public <T> void Foo(T t)
{
}
}
例如
Rule<String> r = new Rule<String>();
这通常是否适用于类的类型参数,在它们不冲突的情况下?我的意思是当只有类具有类型参数而不是构造函数时,或者这样做对于构造函数中的类型参数?如果他们发生冲突,这会如何变化?
见下面的讨论
如果我有函数调用
x = <Type Parameter>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.
答案 0 :(得分:7)
您的所有T
都不同,但只有在使用complete syntax调用您的方法时才能看到它:
例如,此代码有效:
new <Float>Rule<Integer>().<Character>Foo();
为了让这更容易解释,让我们假设您的代码是这样的:
class Rule<A>
{
public <B>Rule()
{
}
public <C> void Foo()
{
}
}
然后您可以显式声明泛型类型,如:
new <B>Rule<A>().<C>Foo();
如果类型具有相同的名称,则将选择最内层的类型(方法上的T
,而不是类):
使用此代码,参数:
class Rule<T>
{
public <T>Rule(T t)
{
}
public <T> void Foo(T t)
{
}
}
然后这是有效的:
new <Float>Rule<Integer>(3.2f);
请注意,构造函数中的T
为Float
,而不是Integer
。
另一个例子:
class Example<T> {
public <T> void foo1() {
// T here is the <T> declared on foo1
}
public void foo2() {
// T here is the <T> declared on the class Example
}
}
我发现了另一个涉及calling methods with explicit generic types without something before them的问题。看起来静态导入和同类方法调用是相同的。看起来Java不允许你出于某种原因开始使用<Type>
。
答案 1 :(得分:1)
方法类型参数是否影响类类型参数?
构造函数上的<T>
声明未引用类类型。所以是的,它会影响类类型参数。
在这种情况下,它被用作可以与构造函数一起使用的泛型类型参数,例如作为参数。试试这个构造函数:
public <P> Rule(P arg1, P arg2) {
}
如您所见,我定义了一个类型<P>
,然后我使用它来确保参数的类型为P
。在您的情况下,您声明一个对构造函数有效的类型而不使用它。
看看这个page。
另外,当你创建一个对象时,它是否使用了类的类型参数?
每个泛型类型定义都将范围作为变量。因此,在构造函数之外返回有效的类类型。