在Java泛型中创建类型对象

在Java泛型中创建类型对象,java,generics,interface,Java,Generics,Interface,我们是否可以在Java泛型中创建一个类型类对象,比如tt=new T() 这是我的密码 public class Graph<T extends NeighbourInt<T>> { Map<String, List<T>> adjecencyList; public Graph() { adjecencyList = new HashMap<>(); } public void a

我们是否可以在Java泛型中创建一个类型类对象,比如
tt=new T()

这是我的密码

public class Graph<T extends NeighbourInt<T>> {

    Map<String, List<T>> adjecencyList;

    public Graph() {
        adjecencyList = new HashMap<>();
    }

    public void addEdge(String vertex1, String vertex2, int weight) {
        if (adjecencyList.containsKey(vertex1)) {
           List<T> neg = adjecencyList.get(vertex1);
           neg.add(new T (vertex2, weight));
       } else {
           List<T> neg = new ArrayList<>();
           neg.add(new T(vertex2, weight));
           adjecencyList.put(vertex1, neg);
       }
    }
}
公共类图{
地图邻接列表;
公共图(){
adjencylist=新HashMap();
}
公共void addEdge(字符串顶点1、字符串顶点2、整数权重){
if(邻接列表containsKey(顶点1)){
List neg=adjacencylist.get(顶点1);
负添加(新T(顶点2,重量));
}否则{
List neg=new ArrayList();
负添加(新T(顶点2,重量));
邻接列表放置(顶点1,负);
}
}
}
我的邻居界面

public interface NeighbourInt<T> extends Comparable<T> {

    public String getVertex();

    public void setVertex(String vertex);

    public int getWeight();

    public void setWeight(int weight);

}
公共接口邻域扩展{
公共字符串getVertex();
公共无效集合顶点(字符串顶点);
public int getWeight();
公共空隙设定重量(内部重量);
}

是否有可能启动一个对象,如new T();在Java泛型中?

否。实际上,
T
是泛型类型的参数,而不是类

例如:

public interface NeighbourInt extends Comparable<NeighbourInt> {
    // ...
}
参数化的
Compariable
相当于具有以下方法的接口:

int compareTo(NeighbourInt o); 
因此,上面声明的
邻域
继承了该方法

编辑:将泛型类看作是一个“类工厂”的类,一个制造其他类的类。因此,只有当您需要有许多不同类型的“制造”类作为参数时,才能创建泛型类

因此宣布:

public class Graph<T extends NeighbourInt> {
    // ...
}
没有,还没有(又是因为擦除)

但是,
Graph
的构造函数可以接受一个生成器,该生成器从(String,int)创建
T
;当需要创建新的
T
时,调用此生成器

在Java8中,您可以

public Graph( BiFunction<String,Integer,T> generator )
new Graph<>( Foo::new )
你能行

public Graph( BiFunction<String,Integer,T> generator )
new Graph<>( Foo::new )
新图形(Foo::new)

No这是不可能的,因为在运行时,泛型会消失。您可以使用
Class.newInstance
来执行此操作您不想创建新的
T
实际上只想使用传入的参数
tn
。i、 e.
neg.add(n)
很抱歉出错,我更正为addEdge(字符串顶点1,字符串顶点2,int-weight){…}。我想添加一个T类型的新对象来实现邻接属性。好的,让我再次澄清。您不需要
addEdge(字符串顶点1、字符串顶点2、整数权重)
您想要的是您原来拥有的。让打电话的人为你做一个新的
T
。是的,我最初试过。但我想知道是否有一种方法可以使构造函数也可以安全地用作新的T()或新的T(字符串顶点,int-weight)。从所有的答复来看,我认为没有这样的办法。感谢您的快速回复:)是的,这是真的:)但我想在列表AdjencyList中添加一个新的类型T对象,它可以包含类型T的对象。有可能吗?可能您过度使用了泛型。为什么需要将
Graph
类声明为泛型类型?更新了我的答案。adjcencyList实际上只使用邻接方法。但是有一种新类型的have类,它也只有很少的方法。我想我明白你的意思了。如果有一个包含新方法的decorator类,并且实现了邻居接口,那就太好了。Thanx的回答是:)1加上Java8的东西。我认为这有助于改善这种情况。感谢您的回复:)@sandaru.ny-好吧,这个问题不需要java8;在Java7中它只会更加冗长。
public Foo(String, int)
new Graph<>( Foo::new )