7

这段代码似乎工作正常

class Rule<T>
{

    public <T>Rule(T t)
    {

    }
    public <T> void Foo(T t)
    {

    }
 }
  1. 方法类型参数是否会影响类类型参数?
  2. 此外,当您创建一个对象时,它是否使用类的类型参数?

例子

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.
4

2 回答 2

8

您的所有s 都是不同的,但只有在使用完整语法T调用方法时才能看到它:

例如,此代码是有效的:

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
    }
}

我发现另一个问题涉及调用具有显式泛型类型的方法,而在它们之前没有任何东西。看起来静态导入和同类方法调用是一样的。<Type>由于某种原因,Java 似乎不允许您开始一行。

于 2012-04-14T04:54:20.137 回答
1

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

构造函数的<T>声明不引用类类型。所以是的,它隐藏了类类型参数。

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

public <P> Rule(P arg1, P arg2) {    
}

正如你所看到的,我定义了一个类型<P>,然后我使用它来确保参数是 type P。在您的情况下,您正在声明一个对构造函数有效的类型而不使用它。

看看这个页面

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

每个泛型类型定义都具有作为变量的作用域。所以出构造函数返回有效的类类型。

于 2012-04-14T04:54:31.097 回答