小编cha*_*lup的帖子

为什么此代码在sourceCompatibility = 1.8时失败

使用sourceCompatibility = 1.7或1.6编译时,以下代码有效,但切换到1.8后失败:

public class Java8Wat {
  interface Parcelable {
  }

  static class Bundle implements Parcelable {
    public void put(Parcelable parcelable) {
    }

    public void put(Serializable serializable) {
    }

    public <T extends Parcelable> T getParcelable() {
      return null;
    }
  }

  static {
    Bundle inBundle = new Bundle();
    Bundle outBundle = new Bundle();

    outBundle.put(inBundle.getParcelable());
  }
}
Run Code Online (Sandbox Code Playgroud)

编译输出:

Java8Wat.java:23: error: reference to put is ambiguous
        outBundle.put(inBundle.getParcelable());
             ^
both method put(Parcelable) in Bundle and method put(Serializable) in Bundle match
Run Code Online (Sandbox Code Playgroud)

这是代码失败的回购:https://github.com/chalup/java8-wat …

java generics java-8

11
推荐指数
1
解决办法
330
查看次数

使用花括号初始化临时聚合对象

假设我有一节课:

class Aggregate {

public:

    int x;
    int y;

};
Run Code Online (Sandbox Code Playgroud)

我知道如何使用花括号初始化对象:

Aggregate a1 = { 1500, 2900 };
Run Code Online (Sandbox Code Playgroud)

但我找不到合适的语法来创建临时对象并将其作为参数传递给某个方法,例如:

void frobnicate(const Aggregate& arg) { 
    // do something
}

//...

frobnicate(Aggregate {1500, 2900}); // what should this line look like?
Run Code Online (Sandbox Code Playgroud)

最简单的方法是将构造函数添加到Aggregate类,但我们假设我没有访问Aggregate头的权限.另一个想法是写一些工厂方法,即

Aggregate makeAggregate(int x, int y).
Run Code Online (Sandbox Code Playgroud)

我也可以创建一个对象,然后将其作为参数传递等.等.

有很多解决方案,但我只是好奇是否可以使用花括号初始化来实现这个目标.

c++ constructor aggregate initialization curly-braces

5
推荐指数
1
解决办法
4601
查看次数

是否有任何积极支持的Windows的lcov端口

我使用gcov库测量我的代码的覆盖率,我想以用户友好的格式生成覆盖率报告.我已经找到了lcov实用程序,但它与Windows环境不兼容(主要是因为解析路径的方式).有谁知道有效支持Windows的lcov端口?

似乎在Windows上运行它会很容易(它认为它甚至可以通过模仿unix shell命令的行为的少量创意批处理/ perl脚本来解决),并且该工具非常有用,所以我想有人可能有已经完成了.

windows gcov lcov

5
推荐指数
1
解决办法
1万
查看次数

这是使用PIMPL模式的好地方吗?

我正在开发一个为某些服务定义客户端接口的库.在引擎盖下,我必须验证用户提供的数据,然后使用来自另一个库的Connection类将其传递给"引擎"进程(注意:我们的库的用户不知道Connection类).我的一位同事建议使用PIMPL:

class Client {
public:
    Client();
    void sendStuff(const Stuff &stuff) {_pimpl->sendStuff(stuff);}
    Stuff getStuff(const StuffId &id) {return _pimpl->getStuff(id);}
private:
    ClientImpl *_pimpl;
}

class ClientImpl { // not exported
public:
    void sendStuff(const Stuff &stuff);
    Stuff getStuff(const StuffId &id);
private:
    Connection _connection;
}
Run Code Online (Sandbox Code Playgroud)

但是,我发现很难测试 - 即使我将测试链接到一些模拟的Connection实现,我也无法轻松访问它来设置和验证期望.我错过了什么,或者更清洁,更可测试的解决方案是使用interface + factory:

class ClientInterface {
public:
    void sendStuff(const Stuff &stuff) = 0;
    Stuff getStuff(const StuffId &id) = 0;
}

class ClientImplementation : public ClientInterface { // not exported
public:
    ClientImplementation(Connection *connection);
    // +implementation of ClientInterface
}

class …
Run Code Online (Sandbox Code Playgroud)

c++ unit-testing pimpl-idiom

5
推荐指数
1
解决办法
1538
查看次数