class Template<template> {
private template Member;
Template(template Member){
this.Member = Member;
}
public void Print(){
System.out.println(this.Member.toString());
}
}
public class InterfaceTemplateDemo{
public static <template> Template<template> Fun(template param){
//为什么必须在static后面加上<template>否则提示说无法解析template??
//个人认为按照格式
//public static Template<template> Fun(template param)
//就可以了...
return new Template<template>(param);
}
public static void main(String args[]){
Fun("127.0.0.1").Print();
}
}
private template Member;
Template(template Member){
this.Member = Member;
}
public void Print(){
System.out.println(this.Member.toString());
}
}
public class InterfaceTemplateDemo{
public static <template> Template<template> Fun(template param){
//为什么必须在static后面加上<template>否则提示说无法解析template??
//个人认为按照格式
//public static Template<template> Fun(template param)
//就可以了...
return new Template<template>(param);
}
public static void main(String args[]){
Fun("127.0.0.1").Print();
}
}
public static <template> Template<template> Fun(template param){}
如果你把<template>去掉,那代码是:
public static Template<template> Fun(template param){}
首先可以理解Template是一个类.那template列???是什么??
所以必须加上<template>这样写,编译器才知道,他是泛型.
Set<Double> doubles = ...;
Set<Number> numbers = function(integers ,doubles);public static <Number> T function(Set<? extends T> s1,Set<? extends T){
Set<? extends T> set = new Hashset<? extends T>();
set.addAll(s1);
set.addAll(s2);
....
return set;
}
这时候,<Number>就有用了,当你没加上的时候,就报错
Set<Integer> integers = ...;
Set<Double> doubles = ...;
Set<Number> numbers = function(integers ,doubles);public static <T> Set<? extends T> function(Set<? extends T> s1,Set<? extends T){
Set<? extends T> set = new Hashset<? extends T>();
set.addAll(s1);
set.addAll(s2);
....
return set;
}
Template<template>
这句中不是有<template>的吗? 为什么不行的?
public class InterfaceTemplateDemo{
public static Template<String> Fun(String param){
//为什么必须在static后面加上<template>否则提示说无法解析template??
//个人认为按照格式
//public static Template<template> Fun(template param)
//就可以了...
return new Template<String>(param);
}
public static void main(String args[]){
Fun("127.0.0.1").Print();
}
}
这样就可以了,因为你是要实用泛型类,而不是定义新的泛型类。
定义Template类的时候,已经定义泛型template了,而在使用Template的时候,要把template替换为具体的类型。
我这里是替换成String类型,你也可以替换为其他任意类型。
LZ如果仔细比较两个类就清楚了
第一个<template>是放在类之后,也就是声明类的同时也声明template,如果用作用域来比喻的话,那么template在整个类中是有效的,当然这样也限定了该类生成实例时必须指明一个template
而第二个类,除了该static方法外,其他地方并没有声明tamplate,试问,如果不声明,该类又怎么能认识该template呢?从第一个类可知,如果在类后声明template,虽然整个类都可以使用,但是生成实例时也必须要指定template,而第二个类并不想在生成实例时指定一个template,只想在该static方法中使用template,那么template就只能声明在static方法中
static <template> Template<template>中的Template<template>是一种类型,该template并不是声明,只是因为第一个类是这样定义的,所以要使用该类时也要指定template,而static <template>中的template才是对tempate的声明,所以不要搞混了。