Java 为什么我们可以实例化Pair<;T>;但我们可以';带配对的t<&燃气轮机;

Java 为什么我们可以实例化Pair<;T>;但我们可以';带配对的t<&燃气轮机;,java,generics,wildcard,type-parameter,bounded-wildcard,Java,Generics,Wildcard,Type Parameter,Bounded Wildcard,那个么为什么我们能够实例化Pair,但却不能实例化Pair呢 Pair<T> p=new Pair<T>(); Pair p=新的Pair(); VS Pair p=新的Pair(); 我知道表示未知类型-->本身并不意味着什么。T类型必须在类或方法级别的某个位置定义,例如: public class PairFactory<T> { public Pair<T> makePair() { return new Pair<T

那个么为什么我们能够实例化Pair,但却不能实例化Pair呢

Pair<T> p=new Pair<T>();
Pair p=新的Pair();
VS

Pair p=新的Pair();
我知道
表示未知类型-->
本身并不意味着什么。
T
类型必须在类或方法级别的某个位置定义,例如:

public class PairFactory<T> {
  public Pair<T> makePair() {
    return new Pair<T>();
  }
}
公共类PairFactory{
公共对makePair(){
返回新的一对();
}
}
在这种情况下,您可以在实例化期间决定

new PairFactory<String>();
newpairfactory();
这有点复杂:

public <T> Pair<T> makePair() {
  return new Pair<T>();
}
公共对makePair(){
返回新的一对();
}
编译器将尝试根据上下文确定类型,例如:

Pair<Date> p = makePair();
Pair p=makePair();
本身并不意味着什么。
T
类型必须在类或方法级别的某个位置定义,例如:

public class PairFactory<T> {
  public Pair<T> makePair() {
    return new Pair<T>();
  }
}
公共类PairFactory{
公共对makePair(){
返回新的一对();
}
}
在这种情况下,您可以在实例化期间决定

new PairFactory<String>();
newpairfactory();
这有点复杂:

public <T> Pair<T> makePair() {
  return new Pair<T>();
}
公共对makePair(){
返回新的一对();
}
编译器将尝试根据上下文确定类型,例如:

Pair<Date> p = makePair();
Pair p=makePair();

否?和T不是一回事?表示一个通配符泛型类型参数——它可以是运行时的任何类型
T
表示一个泛型类型参数,它在运行时将是一个特定的类型——我们只是在编译时不知道它


也就是说,
列表
可以包含字符串、整数、浮点等。
列表
只能包含参数化为的任何内容。

否?和T不是一回事?表示一个通配符泛型类型参数——它可以是运行时的任何类型
T
表示一个泛型类型参数,它在运行时将是一个特定的类型——我们只是在编译时不知道它


也就是说,
列表
可以包含字符串、整数、浮点等。
列表
只能包含参数化为的任何内容。

不允许使用通配符作为参数进行实例化,因为它通常是无用的。相反,您可以只使用类型参数边界内的任何引用类型(在本例中,没有边界,所以只使用任何引用类型):

class SuperCrazyBogusType{}
对p=新对();
(也可以使用更普通的类型,如
对象

你知道这有多奇怪吗?是的,您可以使用任意类型进行实例化,即使这些类型与程序的其余部分或您正在执行的操作无关。是的,它是100%安全和正确的,因为您所需要的只是一对(某种未知类型的一对)


这就指出了为什么它是荒谬的,为什么这样做的语法是不必要的。由于您不知道类型参数,因此您几乎无法使用所获得的
执行任何操作(例如,您无法将任何数据放入其中)。

不允许使用通配符作为参数进行实例化,因为它通常是无用的。相反,您可以只使用类型参数边界内的任何引用类型(在本例中,没有边界,所以只使用任何引用类型):

class SuperCrazyBogusType{}
对p=新对();
(也可以使用更普通的类型,如
对象

你知道这有多奇怪吗?是的,您可以使用任意类型进行实例化,即使这些类型与程序的其余部分或您正在执行的操作无关。是的,它是100%安全和正确的,因为您所需要的只是一对(某种未知类型的一对)


这就指出了为什么它是荒谬的,为什么这样做的语法是不必要的。你几乎无法处理你得到的
(例如,你不能将任何数据放入其中),因为你不知道类型参数。

@skystar7:这就是我试图解释的(如果不清楚的话,很抱歉):
新对
有效,因为
t
是在早些时候定义的<代码>
只是一个占位符,
新的一对
从来没有完全定义过谢谢…我现在明白你的意思了,如果一个对象不知道它是什么类型,编译器如何为它分配内存???@jahroy:首先,它知道,
t
在编译时是已知的。其次,它不必知道,这些对象几乎不包含对类型
t
的引用。引用只是32位或64位指针。这取决于您以后创建所述对象。我指的是何时使用
代替
(但我的评论可能仍然很遥远)…@skystar7:这就是我试图解释的(如果不清楚的话,很抱歉):
新的一对
有效,因为
T
是在较早的地方定义的<代码>
只是一个占位符,
新的一对
从来没有完全定义过谢谢…我现在明白你的意思了,如果一个对象不知道它是什么类型,编译器如何为它分配内存???@jahroy:首先,它知道,
t
在编译时是已知的。其次,它不必知道,这些对象几乎不包含对类型
t
的引用。引用只是32位或64位指针。这取决于您以后创建所述对象。我指的是何时使用
代替
(但我的评论可能仍有很大差距)。。。