Java 为什么我们可以实例化Pair<;T>;但我们可以';带配对的t<&燃气轮机;
那个么为什么我们能够实例化Pair,但却不能实例化Pair呢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<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位指针。这取决于您以后创建所述对象。我指的是何时使用
代替
(但我的评论可能仍有很大差距)。。。