在用java 原型 的时候会有很多有意思的 问题,下面的代码红色部分很有意思。难以解释,同一个T类型的对象赋予两个不同类型的对象,我想这个T的类型是Object。
package tt;
interface Factory<T>{
T create();
}
class ContainerBuilder{
public <T> ContainerBuilder factory(Class<T> type){
return this;
}
public <T> ContainerBuilder factory(Class<T> type,
Factory<? extends T> factory) throws Exception {
//System.out.println(type);
T t = type.getConstructor(new Class[] { String.class }).newInstance(
"String");
if(t instanceof String)
System.out.println("new Instance:" + t);
t = factory.create();
if(t instanceof Gtest)
System.out.println(t);
return this;
}
}
class Gtest{
}
public class GenericTest {
ContainerBuilder builder=new ContainerBuilder();
public Object test() throws Exception{
builder.factory(String.class);
return builder.factory(String.class, new Factory(){
public Gtest create(){
return new Gtest();
}
});
}
public static void main(String[] args) throws Exception{
GenericTest gt=new GenericTest();
try{
System.out.println(gt.test());
}catch(Exception e)
{
e.printStackTrace();
}
}
}
RUN后的输出:
new Instance:String
tt.Gtest@1a46e30
tt.ContainerBuilder@3e25a5
package tt;
interface Factory<T>{
T create();
}
class ContainerBuilder{
public <T> ContainerBuilder factory(Class<T> type){
return this;
}
public <T> ContainerBuilder factory(Class<T> type,
Factory<? extends T> factory) throws Exception {
//System.out.println(type);
T t = type.getConstructor(new Class[] { String.class }).newInstance(
"String");
if(t instanceof String)
System.out.println("new Instance:" + t);
t = factory.create();
if(t instanceof Gtest)
System.out.println(t);
return this;
}
}
class Gtest{
}
public class GenericTest {
ContainerBuilder builder=new ContainerBuilder();
public Object test() throws Exception{
builder.factory(String.class);
return builder.factory(String.class, new Factory(){
public Gtest create(){
return new Gtest();
}
});
}
public static void main(String[] args) throws Exception{
GenericTest gt=new GenericTest();
try{
System.out.println(gt.test());
}catch(Exception e)
{
e.printStackTrace();
}
}
}
RUN后的输出:
new Instance:String
tt.Gtest@1a46e30
tt.ContainerBuilder@3e25a5