我仍然在围绕Go中的接口和指针的细节包裹.我遇到了一个包含指向net.Conn的指针的简单类型的问题.当我尝试在指针上调用方法(Close)时,我正在接收type *net.Conn has no field or method Close
这是一个突出问题的简单例子:http://play.golang.org/p/Q4LB0wi6Tk
Close()
在这里打电话的正确方法是什么?
我今天看到了一个精彩的注释世界的一瞥,所以我尝试了自己的代码,但它不想编译:
public @interface SomeAnnotation {
public String sayHello1() default "Hello world";
default public String sayHello2() {
return "Hello world";
}
}
Run Code Online (Sandbox Code Playgroud)
您看到的sayHello1
是如何指定注释的默认参数.
我想知道的是,为什么sayHello2
不允许,这是自Java 8以来可用的.
对我而言似乎提供相同的功能,或者我在这里遗漏了什么?
此外,为什么注释可以访问自Java 5以来的默认方法体(尽管非常简单),而接口必须等到Java 8?
我一般都知道:
接口是一种引用类型,它类似于一个类,它只能包含常量,方法签名,默认方法,静态方法和嵌套类型.方法体仅适用于默认方法和静态方法.接口无法实例化 - 它们只能由类实现或由其他接口扩展?
但是必需和提供的接口有什么区别?
如果我有一组枚举,并希望让它们都实现一个接口,这是一般的正确方法吗?
枚举:
public enum MentalSkill implements SkillType {
ACADEMICS,COMPUTER,CRAFTS,INVESTIGATION,MEDICINE,OCCULT,POLITICS,SCIENCE;
private static final int UNTRAINED_PENALTY = -3;
@Override
public SkillType fromValue(String value) {
return valueOf(value);
}
@Override
public int getUntrainedPenalty() {
return UNTRAINED_PENALTY;
}
}
Run Code Online (Sandbox Code Playgroud)
接口:
public interface SkillType {
SkillType fromValue(String value);
int getUntrainedPenalty();
}
Run Code Online (Sandbox Code Playgroud)
持有班级(我怀疑这是不对的):
public class SkillsSet<T extends SkillType> {
T t;
Map<T,Integer> skills = new HashMap<>();
public SkillsSet(String[] skills) {
for (String string : skills) {
addSkill(string,t.getUntrainedPenalty());
}
}
private void addSkill(String skillString,Integer value) {
skills.put((T) t.fromValue(skillString), …
Run Code Online (Sandbox Code Playgroud) 我有一个包含80多个方法的类,每个方法都接受一个包含一些已定义接口的对象.
class Stuff {
/* many more */
getAccount(req: IAccount, callback: ICallback) {
return this._call('getAccount', req, callback);
}
getIds(req: IIDs, callback: ICallback) {
return this._call('getIds', req, callback);
}
/* many more */
}
Run Code Online (Sandbox Code Playgroud)
非常'无聊'的东西,因为它只是映射到底层_call
方法,并使每种方法的类型安全.
但有时这些req
param对象是由2个或更多接口组成的,而不是每次创建另一个接口都有"尴尬",如下所示:
export interface ILoled extends IAccount {
loled: boolean;
}
export interface IRofloled extends ILoled {
rofled: boolean;
}
class Stuff {
getLols(req: ILoled){
}
getRofls(req: IRofloled){
}
}
Run Code Online (Sandbox Code Playgroud)
有什么方法我可以把它作为方法参数列表中的接口的"内联"混合?喜欢(显然不起作用):
class Stuff {
getMoreStuff(req: <{} extends IAccount, ITime>) {
}
}
Run Code Online (Sandbox Code Playgroud) 假设我有一个以下的C#界面:
public interface IInterface<T> where T : SomeClass
{
void InterfaceMethod();
}
Run Code Online (Sandbox Code Playgroud)
而SomeClass的定义如下:
public class SomeClass
{
public void SomeMethod();
}
Run Code Online (Sandbox Code Playgroud)
现在我想定义接口的实现,它不会编译:
public class InterfaceImpl<T> : IInterface<T>
{
public void InterfaceMethod()
{
T test = default(T);
test.SomeMethod(); //Gives Error
}
}
Run Code Online (Sandbox Code Playgroud)
在我改为之前:
public class InterfaceImpl<T> : IInterface<T> where T : SomeClass
{
public void InterfaceMethod()
{
T test = default(T);
test.SomeMethod(); //Compiles fine
}
}
Run Code Online (Sandbox Code Playgroud)
类型约束是否也从接口"继承"(不是正确的词,我知道)是否有意义?
在本文档"与其他片段进行通信"中,Google告诉我们,传递Activity和Fragment的最佳实践是实现一个接口.然后,此接口可以由Fragment调用并在Activity中执行必要的行为.
但也有一种黑客方式来做到这一点.通过方法"getActivity()"直接获取Activity ,然后我们可以使用它下面的所有"公共方法".
这让我很困惑.因为我无法想到使用黑客方式做任何这一点的任何关键缺点.
我头脑中出现的第一种方法的优点是:
好吧,在我总结出这些之后,我对自己有点说服了.但坦率地说,我真的想要一些其他坚实的,并且必须有理由这样做.任何想法或文件将非常感谢!!
有没有办法让接口还包含Go中另一个接口定义的方法?
例如:
type BasicDatabase interface {
CreateTable(string) error
DeleteTable(string) error
}
type SpecificDatabase interface {
CreateUserRecord(User) error
}
Run Code Online (Sandbox Code Playgroud)
我想要一种方法来指定SpecificDatabase
接口包含BasicDatabase
接口.类似于Go的方式让你做结构的组合.
这样我的方法可以采用一种实现SpecificDatabase
但仍然可以调用CreateTable()
它的类型.
我有一个接口IMenuItem
public interface IMenuItem {
String getIconClass();
void setIconClass(String iconClass);
String getLink();
void setLink(String link);
String getText();
void setText(String text);
}
Run Code Online (Sandbox Code Playgroud)
然后我有这个接口的实现
@Component
@Scope("prototype")
public class MenuItem implements IMenuItem {
private String iconClass;
private String link;
private String text;
public MenuItem(String iconClass, String link, String text) {
this.iconClass = iconClass;
this.link = link;
this.text = text;
}
//setters and getters
}
Run Code Online (Sandbox Code Playgroud)
有没有办法只使用IMenuItem接口从配置类创建多个MenuItem实例?用@autowired还是什么?也可以通过指定构造函数的参数来自动装配?
interface ×10
java ×6
go ×2
oop ×2
.net ×1
android ×1
annotations ×1
autowired ×1
c# ×1
enums ×1
generics ×1
inheritance ×1
java-8 ×1
modeling ×1
performance ×1
pointers ×1
spring ×1
typescript ×1
uml ×1